Trừ khi bạn đang sử dụng AbsoluteLayout (Thông thường là một ý tưởng rất tệ, khi bạn thiết kế bố cục của mình bằng tọa độ x / y, sẽ chỉ phù hợp với thiết bị được thiết kế trên), điều này không nên xảy ra - các ứng dụng Android sẽ tự động điều chỉnh theo kích thước màn hình của thiết bị . Tuy nhiên, từ những gì bạn mô tả (Bố cục không điều chỉnh theo Màn hình bảng), có vẻ như AbsoluteLayout có thể là vấn đề ở đây.
Đảm bảo rằng trong các tệp XML bố trí của bạn, bạn KHÔNG sử dụng bố cục tuyệt đối (điều này bao gồm cài đặt tọa độ / chiều rộng / chiều cao rõ ràng trên bất kỳ loại Chế độ xem nào). Thay vào đó hãy xem xét sử dụng:
- Tuyến tính - Xếp chồng nhiều chế độ xem theo chiều ngang hoặc chiều dọc
- FrameLayout - Thường chứa một Con
- RelativeLayout - Sắp xếp trẻ em tương đối với nhau
- TableLayout - Bố cục dựa trên bảng
- ScrollView - Có thể chứa một mục con (chẳng hạn như linearLayout) và cho phép bạn cuộn nội dung của nó
... Bất cứ điều gì phù hợp nhất với mục đích của bạn.
Nếu bạn chưa quen với Android , thì Google cung cấp một hướng dẫn hay giới thiệu về các loại Bố cục khác nhau được đề cập ở trên. Nhiều hướng dẫn có thể được tìm thấy ở đây .
Hơn nữa, Cấp API của bạn sẽ có liên quan (để biết bạn đang sử dụng Android 2.x hay 4.x - Tôi không giả sử 3.x vì nó không có sẵn cho Điện thoại thông minh) để tìm ra nguyên nhân của vấn đề của bạn.
Bạn có đang buộc Ứng dụng của mình vào chế độ Chân dung bằng cách cài đặt:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set screen orientation for this dialog to portrait
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
... trong Hoạt động của bạn hiển thị chế độ xem của trò chơi?
Vui lòng cung cấp thêm thông tin về cách bạn bố trí các chế độ xem của mình (bạn đang sử dụng XML cho bố cục mà sau này bạn sẽ tăng trong Hoạt động của mình hay bạn đang sử dụng bố cục trong mã trong Hoạt động của mình, v.v.)? Hơn nữa: Bạn đã thử chạy ứng dụng của mình trong Điện thoại thông minh - và Trình giả lập cỡ máy tính bảng chưa? Nếu có, vấn đề vẫn tồn tại?
CẬP NHẬT: CÁCH QUY MÔ BITMAPS
OP đã hỏi làm thế nào anh ta có thể mở rộng quy mô của bitmap mà anh ta đang sử dụng trong trò chơi của mình. Một tùy chọn (từ tất cả những gì tôi biết về thiết lập của OP): SurfaceHolder.Callback mà bạn đang ghi đè để hiển thị trò chơi của mình và trên đó bạn kết xuất tất cả các Bitmap, v.v ... có một phương thức gọi là:
surfaceChanged(SurfaceHolder holder, int format, int width, int height)
Phương pháp đó cung cấp cho bạn chiều rộng / chiều cao của bề mặt của bạn, vì vậy bây giờ bạn có thể sử dụng:
Bitmap.createScaledBitmap (Bitmap src, int dstWidth, int dstHeight, boolean filter)
từ lớp Bitmap . Để thay đổi kích thước hình ảnh của bạn theo tỷ lệ với kích thước của bề mặt bạn đang vẽ.
Những gì bạn cần làm là thế này: Nếu bạn biết kích thước của bitmap liên quan đến kích thước màn hình nhất định, ví dụ như kích thước màn hình của điện thoại thông minh của bạn. Sau đó, bạn có thể tính toán kích thước đích của bitmap được chia tỷ lệ. Đây là toán học (được bao bọc trong một ví dụ):
Giả sử bạn có Bitmap A với kích thước 25x50 (widthxheight) được hiển thị trên màn hình với kích thước 100x200 (widthxheight). Đối với kích thước màn hình đó (100x200), bitmap có kích thước chính xác - bây giờ nếu bạn muốn hiển thị bitmap trên màn hình lớn hơn, bạn cần phải:
- Tính hệ số tỷ lệ cho kích thước bitmap
- Duy trì tỷ lệ khung hình của bitmap (để nó không bị biến dạng)
Giả sử màn hình lớn hơn là 200x300 (widthxheight) thì hệ số tỷ lệ cho chiều rộng là:
200(target screen width)/100(default screen width) = 2
Vì vậy, 2 là hệ số tỷ lệ của chúng tôi cho giá trị chiều rộng và chiều cao của bitmap, vì chúng tôi cần duy trì tỷ lệ khung hình của bitmap, chúng tôi có thể chỉ cần nhân hệ số tỷ lệ với chiều rộng và chiều cao của bitmap:
bitmapWidth * 2 = scaledBitmapWidth
bitmapHeight * 2 = scaledBitmapHeight
Vì vậy, sử dụng ví dụ bitmap A của chúng tôi từ phía trên và công thức đã đề cập, kích thước mới của bitmap sẽ là: 50x100 (widthxheight) vì:
2*25(width) = 50 height
2*50(height) = 100 height
Bây giờ chúng ta đã biết kích thước mới của bitmap của mình, chúng ta chỉ cần sử dụng lệnh gọi API mà tôi đã đề cập ở trên và điền vào chỗ trống:
Bitmap.createScaledBitmap (myBitmap, 50, 100, false)
myBitmap trong ví dụ trên là bitmap A ban đầu có kích thước 25x50 và được chia tỷ lệ thành 50x100 bằng đoạn mã trên.
Tuy nhiên - điều này sẽ không giải quyết được vấn đề ban đầu của bạn về ứng dụng chỉ chiếm góc trên bên phải của thiết bị có kích thước máy tính bảng. Để trả lời câu hỏi đó, chúng tôi cần có câu trả lời cho các câu hỏi mà chúng tôi đã hỏi bạn về thiết lập của bạn. Tôi sẽ nhanh chóng tổng hợp chúng ở đây:
- Bạn đang sử dụng một công cụ trò chơi như AndEngine hoặc Unity ?
- Bạn đang viết bố cục của bạn trong xml? Nếu có, bố cục gốc của bạn để hiển thị nội dung trò chơi của bạn là gì?
- Bạn đã đề cập rằng bạn đang triển khai SurfaceHolder.Callback? Chiều rộng / chiều cao được cung cấp trong lệnh gọi phương thức của SurfaceChanged cung cấp cho bạn kích thước của bề mặt - nó có cùng kích thước khi ứng dụng của bạn chạy trên điện thoại thông minh hoặc máy tính bảng không?
- Bạn có quyền truy cập vào SurfaceView (hoặc bất cứ điều gì được liên kết với SurfaceHolder đó không. Bạn đang thực hiện), vì vậy chúng tôi có thể xác định xem đó có phải là cài đặt kích thước ứng dụng theo kích thước điện thoại thông minh một cách cứng nhắc không.
- Các vấn đề thay đổi kích thước tương tự có xảy ra trong trình giả lập với độ phân giải màn hình khác nhau không?
Một nghi ngờ chung: Không phải mọi điện thoại thông minh đều có cùng kích thước màn hình, trên thực tế có một loạt kích thước màn hình, điều này khiến tôi tự hỏi: Bạn đã bao giờ thử nghiệm ứng dụng của mình trên điện thoại thông minh có kích thước màn hình khác với màn hình của bạn chưa? Bởi vì - thực tế là nó phù hợp với màn hình của bạn, nhưng không phải là máy tính bảng, khiến tôi tự hỏi ai sẽ đặt các kích thước đó và khi nào. Bởi vì tôi nghi ngờ rằng một ứng dụng có thể điều chỉnh cho tất cả các kích cỡ màn hình điện thoại thông minh, nhưng không phải với kích thước máy tính bảng - sẽ không có ý nghĩa gì (vì chúng ít nhiều có cùng lõi Android chạy trên chúng, một số khác biệt giữa sx, 3. x và 4.x sang một bên) KHÔNG GIỚI HẠN bạn đang sử dụng một khung không hỗ trợ (vì bất kỳ lý do gì - có thể bạn phải mua hỗ trợ máy tính bảng bổ sung hoặc bất cứ thứ gì) kích thước màn hình cỡ máy tính bảng. Đó là lý do tại sao điều thực sự quan trọng cần biết, liệu ứng dụng có thay đổi kích thước đúng trên điện thoại của bạn hay không, hoặc trên các điện thoại thông minh khác là tốt. Cách duy nhất tôi nhận thức được làm thế nào một ứng dụng có thể bị giới hạn ở kích thước màn hình của một điện thoại cụ thể là bằng cách sử dụng AbsoluteLayout và nói chung là kích thước tuyệt đối cho các tiện ích, v.v ...
CẬP NHẬT: Chia tỷ lệ x / y Tọa độ
Để điều chỉnh vị trí của bitmap của bạn theo kích thước màn hình, một số thứ như sau sẽ thực hiện công việc:
- Kích thước màn hình: 100/200 (chiều rộng / chiều cao)
- Vị trí bitmap: x = 50 / y = 100
Bây giờ, nếu bạn tăng kích thước màn hình, bạn phải chia tỷ lệ các giá trị x / y đó theo:
- Kích thước màn hình: 200/400 (chiều rộng / chiều cao)
Hệ số tỷ lệ sẽ là 2, vì chiều rộng và chiều cao tăng bằng hai. Do đó kích thước sẽ là ...
- Vị trí bitmap: x = 100 / y = 200
Một lần thử khác - lần này với các yếu tố tỷ lệ khác nhau cho chiều rộng / chiều cao
- Kích thước màn hình: 100/150 (chiều rộng / chiều cao)
- Vị trí bitmap: x = 50 / y = 50
Nếu màn hình đích mới là 150/250 thì các phép tính là:
- Hệ số tỷ lệ cho width = targetWidth / originalWidth = 1.5
- Hệ số tỷ lệ cho chiều cao = targetHeight / originalHeight = 1.666 ... (Kỳ)
Bây giờ chúng ta cần chia tỷ lệ tọa độ x / y, x được chia tỷ lệ bằng tỷ lệ chiều rộng và chiều cao được chia tỷ lệ bằng tỷ lệ chiều cao, đây là kết quả:
- x = gốcX * 1,5 = 75
- y = gốcY * 1.666 .. (Kỳ) = 83.333 ... (Kỳ)
Vì vậy, kích thước màn hình mới và tọa độ x / y được chia tỷ lệ là:
- chiều rộng = 150
- chiều cao = 250
- x = 75
- y = 83.333 ... (Kỳ)
Để làm cho một câu chuyện dài ngắn, thuật toán để nhân rộng ảnh bitmap là:
X = (targetScreenWidth / defaultScreenWidth) * defaultXCoordinate
Y = (targetScreenHeight / defaultScreenHeight) * defaultYCoordinate