Kết hợp trò chơi Android với các kích thước màn hình khác nhau


11

Tôi đang làm một trò chơi Android chỉ theo hướng màn hình dọc. Nó hoạt động rất tốt khi tôi chạy nó trên điện thoại của mình, nhưng khi tôi chạy nó trên máy tính bảng, mặc dù kích thước màn hình lớn hơn, tất cả các bitmap đều có cùng kích thước. Có cách nào để làm cho bitmap giữ nguyên tỷ lệ ngay cả trên các màn hình kích thước khác nhau không?

Câu trả lời:


11

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

Trò chơi của tôi sử dụng bảng điều khiển trò chơi mở rộng SurfaceHolder.Callback (Đó là trong tệp XML được gọi bởi một Hoạt động). Điều này có thể là một phần của vấn đề?
user1404512

@ user1404512 SurfaceHolder.Callback thường được liên kết với SurfaceView - và nó cũng phụ thuộc vào cách SurfaceView được định cấu hình (chiều rộng / chiều cao) nếu được nhúng trong Bố cục khác (như FrameLayout, v.v.) ... trong SurfaceHolder của bạn. nên là một phương thức: public void SurfaceChanged (giá đỡ SurfaceHolder, định dạng int, int width, int height) chiều rộng và chiều cao phải là kích thước của những gì được vẽ trên màn hình - trong trường hợp của bạn sẽ giống với máy tính bảng và điện thoại thông minh - có thể bạn xác minh điều đó?
Đặc vụKnopf

Vâng, tôi nghĩ rằng tôi nên nói điều này: Khi tôi chạy nó trên máy tính bảng của mình, mặc dù kích thước màn hình lớn hơn, tất cả các bitmap đều có cùng kích thước. Có cách nào để làm cho bitmap giữ nguyên tỷ lệ ngay cả trên các màn hình kích thước khác nhau không?
user1404512

@ user1404512 Điều thực sự quan trọng là bạn trả lời tất cả những câu hỏi mà chúng tôi đã hỏi bạn, bởi vì chúng tôi vẫn ở trong bóng tối về cách bố trí của bạn được thiết kế, điều này gây khó khăn khi trả lời bất kỳ câu hỏi cụ thể nào. Đối với ảnh bitmap của bạn: Tôi đã cập nhật câu trả lời của mình để trả lời câu hỏi chia tỷ lệ bitmap tốt nhất có thể, với điều kiện là rất ít thông tin về thiết lập của bạn.
Đặc vụKnopf

Không, tôi không sử dụng công cụ trò chơi. Tôi có bố cục của mình trong xml và trong tệp xml của tôi, tôi có SurfaceHolder.Callback đó là toàn bộ màn hình. Chiều rộng và chiều cao của giá đỡ thay đổi từ màn hình này sang màn hình khác. Tôi nghĩ rằng vấn đề của tôi là tôi đang vẽ các bitmap với tọa độ X và Y, nhưng tỷ lệ của các bitmap vẫn giữ nguyên từ màn hình này sang màn hình khác. Có cách nào để khắc phục điều này? Cảm ơn rất nhiều trước!
user1404512

3

Có một bài viết hay và có liên quan trên Android.com: http://developer.android.com/guide/practices/sc Greens_support.html

Tham chiếu này giúp bạn sắp xếp thông qua kích thước màn hình, mật độ màn hình và độ phân giải. Mục tiêu là sử dụng API Android để đạt được "tính độc lập mật độ" để các thành phần và đồ họa giao diện người dùng của bạn có thể trông đẹp trên nhiều thiết bị khác nhau.

Hãy nhớ rằng bạn cũng có thể tạo các cấu hình khác nhau của Thiết bị ảo Android cho trình giả lập trong khi bạn đang kiểm tra bố cục và giao diện: http://developer.android.com/guide/developing/devices/emulator.html


0

Chỉ là một shot trong bóng tối ở đây. Bạn đã đặt bất cứ bố cục chính nào để điền vào cha mẹ theo cả chiều dọc và chiều ngang chưa?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.