Menyesuaikan game Android dengan berbagai ukuran layar

11

Saya membuat game Android yang hanya berorientasi layar potret. Ini berfungsi dengan baik ketika saya menjalankannya di ponsel saya, tetapi ketika saya menjalankannya di tablet, meskipun ukuran layar lebih besar, semua bitmap memiliki ukuran yang sama. Apakah ada cara untuk membuat bitmap tetap dengan proporsi yang sama bahkan pada layar ukuran yang berbeda?

pengguna1404512
sumber

Jawaban:

11

Kecuali jika Anda menggunakan AbsoluteLayout (Biasanya ide yang sangat buruk, saat Anda mendesain tata letak menggunakan koordinat x / y, yang hanya akan sesuai dengan perangkat yang telah dirancangnya) ini seharusnya tidak terjadi - aplikasi Android secara otomatis menyesuaikan dengan ukuran layar perangkat. . Namun dari apa yang Anda jelaskan (Layout tidak menyesuaikan dengan Table Table), sepertinya AbsoluteLayout mungkin menjadi masalah di sini.

Pastikan bahwa dalam file XML layout Anda, Anda TIDAK menggunakan tata letak absolut (ini termasuk menetapkan koordinat / lebar / ketinggian eksplisit pada segala jenis tampilan). Alih-alih mempertimbangkan menggunakan:

  • LinearLayout - Menumpuk banyak tampilan secara horizontal atau vertikal
  • FrameLayout - Biasanya berisi satu Anak
  • RelativeLayout - Sejajarkan anak-anak relatif satu sama lain
  • TableLayout - Layout berbasis tabel
  • ScrollView - Dapat berisi satu item anak (seperti LinearLayout) dan memungkinkan Anda menggulir kontennya

... apa pun yang paling sesuai dengan tujuan Anda.

Jika Anda baru mengenal Android , maka Google menawarkan tutorial yang bagus yang memperkenalkan berbagai Tipe Tata Letak yang disebutkan di atas. Lebih banyak tutorial dapat ditemukan di sini .

Selain itu, Tingkat API Anda akan relevan (untuk mengetahui apakah Anda menggunakan Android 2.x atau 4.x - Saya tidak berasumsi 3.x karena tidak tersedia untuk Smartphone) untuk mencari tahu penyebab masalah Anda.

Apakah Anda memaksa Aplikasi Anda ke mode Potret dengan mengatur:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Set screen orientation for this dialog to portrait
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

... di Aktivitas Anda yang menampilkan tampilan permainan?

Harap berikan lebih banyak info tentang bagaimana Anda menata tampilan Anda (apakah Anda menggunakan XML untuk tata letak yang kemudian Anda kembangkan di Aktivitas Anda, atau apakah Anda menggunakan tata letak kode dalam Aktivitas Anda dll ....)? Selanjutnya: Apakah Anda mencoba menjalankan aplikasi di Smartphone - dan Emulator berukuran Tablet? Jika ya, apakah masalah ini tetap ada?


UPDATE: BAGAIMANA CARA MEMULAI BITMAPS

OP bertanya bagaimana ia bisa menskalakan bitmap yang ia gunakan dalam gimnya. Satu opsi (dari semua yang saya tahu tentang pengaturan OP): SurfaceHolder.Callback yang Anda ganti untuk menampilkan permainan Anda dan di mana Anda membuat semua Bitmap dll ... memiliki metode yang disebut:

surfaceChanged(SurfaceHolder holder, int format, int width, int height)

Metode itu memberi Anda lebar / tinggi permukaan Anda, jadi Anda sekarang bisa menggunakan:

Bitmap.createScaledBitmap (Bitmap src, int dstWidth, int dstHeight, boolean filter)

dari kelas Bitmap . Untuk mengubah ukuran gambar Anda sebanding dengan ukuran permukaan tempat Anda menggambar.

Yang perlu Anda lakukan adalah ini: Jika Anda mengetahui dimensi bitmap Anda terkait dengan screensize yang diberikan, misalnya ukuran layar ponsel cerdas Anda. Kemudian Anda dapat menghitung dimensi target dari bitmap yang diskalakan. Inilah matematika (dibungkus dalam contoh):

Katakanlah Anda memiliki Bitmap A dengan dimensi 25x50 (widthxheight) yang ditampilkan pada layar dengan dimensi 100x200 (widthxheight). Untuk ukuran layar (100x200) bitmap memiliki dimensi yang benar - sekarang jika Anda ingin menampilkan bitmap pada layar yang lebih besar, Anda perlu:

  • Hitung faktor skala untuk ukuran bitmap
  • Pertahankan rasio aspek bitmap (sehingga tidak terdistorsi)

Katakanlah layar yang lebih besar adalah 200x300 (widthxheight) maka faktor skala untuk lebarnya adalah:

200(target screen width)/100(default screen width) = 2

Jadi 2 adalah faktor skala kami untuk nilai lebar dan tinggi bitmap, karena kami perlu mempertahankan aspek rasio bitmap, kami cukup mengalikan faktor skala dengan lebar dan tinggi bitmap:

bitmapWidth * 2 = scaledBitmapWidth
bitmapHeight * 2 = scaledBitmapHeight

Jadi menggunakan contoh bitmap A kami dari atas dan formula yang disebutkan, dimensi baru dari bitmap adalah: 50x100 (widthxheight) karena:

 2*25(width) = 50 height
 2*50(height) = 100 height

Jadi sekarang kita tahu ukuran baru dari bitmap kita, kita cukup menggunakan panggilan API yang saya sebutkan di atas dan mengisi bagian yang kosong:

   Bitmap.createScaledBitmap (myBitmap, 50, 100, false)

myBitmap dalam contoh di atas adalah bitmap A asli yang memiliki dimensi 25x50 dan diskalakan ke 50x100 menggunakan cuplikan kode di atas.


Namun - ini tidak akan menyelesaikan masalah awal Anda dari aplikasi yang hanya mengambil sudut kanan atas perangkat berukuran tablet. Untuk menjawab pertanyaan itu, kami membutuhkan jawaban untuk pertanyaan yang kami tanyakan tentang pengaturan Anda. Saya akan dengan cepat menjumlahkannya di sini:

  • Apakah Anda menggunakan mesin gim seperti AndEngine atau Unity ?
  • Apakah Anda menulis tata letak Anda di xml? Jika ya, bagaimana tata letak root Anda untuk merender konten game Anda?
  • Anda menyebutkan bahwa Anda menerapkan SurfaceHolder.Callback? Lebar / tinggi yang disediakan dalam pemanggilan metode surfaceChanged memberi Anda ukuran permukaan - apakah ukurannya sama ketika aplikasi Anda berjalan di smartphone atau tablet?
  • Apakah Anda memiliki akses ke SurfaceView (atau apa pun yang ditautkan ke SurfaceHolder.Callback yang Anda laksanakan), sehingga kami dapat menentukan apakah itu yang secara kaku mengatur ukuran aplikasi ke ukuran ponsel cerdas.
  • Apakah masalah pengubahan ukuran yang sama terjadi pada emulator dengan resolusi layar yang berbeda?

Kecurigaan umum: Tidak setiap smartphone memiliki ukuran layar yang sama, bahkan ada berbagai ukuran layar, yang membuat saya bertanya-tanya: Apakah Anda pernah menguji aplikasi Anda pada smartphone dengan ukuran layar yang berbeda dari layar Anda? Karena - fakta bahwa itu sesuai dengan layar Anda, tetapi bukan tablet, membuat saya bertanya-tanya siapa yang menentukan dimensi tersebut dan kapan. Karena saya ragu aplikasi dapat menyesuaikan dengan semua ukuran layar ponsel cerdas, tetapi tidak dengan ukuran tablet - tidak masuk akal (karena mereka memiliki inti Android yang sama yang menjalankannya, beberapa perbedaan antara sx, 3. x dan 4.x samping) KECUALI Anda menggunakan kerangka kerja yang tidak mendukung (untuk alasan apa pun - mungkin Anda harus membeli tambahan dukungan tablet atau apa pun) ukuran layar berukuran tablet. Itu sebabnya sangat penting untuk mengetahui, apakah aplikasi hanya mengubah ukuran dengan benar di ponsel Anda, atau di smartphone lain juga. Satu-satunya cara saya mengetahui bagaimana suatu aplikasi dapat dibatasi pada ukuran layar dari satu ponsel tertentu adalah dengan menggunakan AbsoluteLayout dan umumnya dimensi absolut untuk widget dll ...


UPDATE: Penskalaan x / y Koordinat

Untuk menyesuaikan lokasi bitmap Anda dengan ukuran layar, sesuatu seperti yang berikut ini seharusnya berfungsi:

  • Dimensi layar: 100/200 (lebar / tinggi)
  • Lokasi Bitmap: x = 50 / y = 100

Sekarang, jika Anda meningkatkan ukuran layar, Anda harus menskalakan nilai x / y itu di sepanjang:

  • Dimensi layar: 200/400 (lebar / tinggi)

Faktor skala akan menjadi 2, karena lebar dan tinggi sama-sama bertambah dua. Oleh karena itu dimensi akan ...

  • Lokasi bitmap: x = 100 / y = 200

Percobaan lain - kali ini dengan faktor skala berbeda untuk lebar / tinggi

  • Dimensi layar: 100/150 (lebar / tinggi)
  • Lokasi bitmap: x = 50 / y = 50

Jika layar target baru 150/250 maka perhitungannya adalah:

  • Faktor skala untuk lebar = targetWidth / originalWidth = 1.5
  • Faktor skala untuk tinggi = targetHeight / originalHeight = 1.666 ... (Periode)

Sekarang kita perlu skala koordinat x / y, x diskalakan menggunakan skala lebar dan tinggi diskalakan menggunakan skala tinggi, inilah hasilnya:

  • x = originalX * 1.5 = 75
  • y = asliY * 1.666 .. (Periode) = 83.333 ... (Periode)

Jadi dimensi layar baru dan koordinat x / y yang diskalakan adalah:

  • width = 150
  • tinggi = 250
  • x = 75
  • y = 83.333 ... (Periode)

Singkatnya, algoritme untuk penskalaan bitmap adalah:

X = (targetScreenWidth / defaultScreenWidth) * defaultXCoordinate
Y = (targetScreenHeight / defaultScreenHeight) * defaultYCoordinate
Zainodis
sumber
Game saya menggunakan panel game yang memanjang SurfaceHolder.Callback (Ada dalam file XML yang disebut dengan Activity). Mungkinkah ini menjadi bagian dari masalah?
user1404512
@ user1404512 SurfaceHolder.Callback biasanya ditautkan ke SurfaceView - dan itu juga tergantung pada bagaimana SurfaceView dikonfigurasikan (lebar / tinggi) jika tertanam di Layout lain (seperti FrameLayout dll.) ... di A SurfaceHolder.Callback Anda ada harus menjadi metode: public void surfaceChanged (pemegang SurfaceHolder, format int, lebar int, tinggi int) lebar dan tinggi harus menjadi ukuran dari apa yang digambar di layar - yang dalam kasus Anda akan sama pada tablet & smartphone - dapat Anda memverifikasi itu?
AgentKnopf
Ya, saya pikir saya harus mengatakan ini: Ketika saya menjalankannya di tablet saya, meskipun ukuran layar lebih besar, semua bitmap memiliki ukuran yang sama. Apakah ada cara untuk membuat bitmap tetap dengan proporsi yang sama bahkan pada layar ukuran yang berbeda?
user1404512
@ user1404512 Sangat penting, bahwa Anda menjawab semua pertanyaan yang kami tanyakan, karena kami masih agak gelap tentang bagaimana tata letak Anda dirancang, yang membuatnya sulit untuk menjawab pertanyaan spesifik apa pun. Adapun bitmap Anda: Saya memperbarui jawaban saya untuk menjawab pertanyaan penskalaan bitmap sebaik mungkin, mengingat sangat sedikit yang diketahui tentang pengaturan Anda.
AgentKnopf
Tidak, saya tidak menggunakan mesin game. Saya memiliki tata letak saya di xml, dan dalam file xml saya, saya memiliki SurfaceHolder.Callback yang merupakan seluruh layar. Lebar dan tinggi dudukan berubah dari layar ke layar. Saya pikir masalah saya adalah saya menggambar bitmap dengan koordinat X dan Y, tetapi skala bitmap tetap sama dari layar ke layar. Apakah ada cara untuk memperbaikinya? Terima kasih banyak sebelumnya!
user1404512
3

Ada artikel bagus dan relevan di Android.com: http://developer.android.com/guide/practices/screens_support.html

Referensi ini membantu Anda menyortir ukuran layar, kepadatan layar, dan resolusi. Tujuannya adalah untuk menggunakan API Android untuk mencapai "kepadatan independen" sehingga komponen antarmuka pengguna Anda dan grafik dapat terlihat bagus di berbagai perangkat.

Ingatlah bahwa Anda juga dapat membuat konfigurasi Android Virtual Devices yang berbeda untuk emulator saat Anda menguji tata letak dan tampilan: http://developer.android.com/guide/developing/devices/emulator.html

amb
sumber
0

Hanya tembakan dalam gelap di sini. Sudahkah Anda mengatur tata letak master apa pun untuk mengisi induk secara vertikal dan horizontal?

Derek
sumber