Пристосування гри для Android різного розміру екрана


11

Я роблю гру для Android, яка має лише портретну орієнтацію на екран. Це чудово працює, коли я запускаю його на телефоні, але коли я запускаю його на планшеті, навіть якщо розмір екрана більший, всі растрові карти мають однаковий розмір. Чи є спосіб зробити так, щоб растрові карти залишалися однаковими, навіть на екранах різних розмірів?

Відповіді:


11

Якщо ви не використовуєте AbsoluteLayout (Зазвичай це дуже погана ідея, оскільки ви розробляєте макет за допомогою координат x / y, який буде відповідати лише пристрою, на якому він був розроблений), цього не повинно відбуватися - програми Android автоматично підлаштовуються під розмір екрану пристрою. . Однак з того, що ви описуєте (макет не налаштовано на екран таблиці), це здається, що тут може виникнути проблема AbsoluteLayout.

Переконайтеся, що у форматі XML-файлів ви НЕ використовуєте абсолютних макетів (це включає встановлення явних координат / ширини / висоти для будь-якого виду перегляду). Замість цього подумайте про використання:

  • LinearLayout - Зберігає кілька переглядів горизонтально або вертикально
  • FrameLayout - зазвичай містить одну дитину
  • Відносний макет - вирівняйте дітей відносно один одного
  • Табличний макет - на основі таблиці
  • ScrollView - може містити один дочірній елемент (наприклад, LinearLayout) і дозволяє прокручувати його вміст

... що найкраще відповідає вашим цілям.

Якщо ви не новачок в Android , то Google пропонує приємний підручник, який знайомиться з різними типами макета, згаданими вище. Більше навчальних посібників можна знайти тут .

Крім того, ваш рівень API буде релевантним (щоб знати, використовуєте ви Android 2.x або 4.x - я не вважаю, що 3.x, оскільки він не доступний для смартфонів), щоб з'ясувати причину вашої проблеми.

Ви змушуєте свою програму в режимі портрета, встановивши:

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

... у вашій діяльності, яка відображає погляди гри?

Укажіть, будь ласка, більше інформації про те, як ви розміщуєте свої представлення даних (чи використовуєте ви XML для макета, який ви згодом завислите у своїй діяльності, чи ви використовуєте макет у коді у своїй діяльності тощо)? Крім того: Ви спробували запустити додаток у емуляторі розміру смартфона та планшета? Якщо так, чи проблема зберігається?


ОНОВЛЕННЯ: ЯК РОЗМІРИТИ БІТМАПИ

ОП запитав, як він може масштабувати растрові карти, які він використовує у своїй грі. Один варіант (з усього, що я знаю про налаштування ОП): SurfaceHolder.Callback, який ви переосмислюєте, щоб відображати свою гру і на якій ви рендеруєте всі растрові карти тощо ..., є метод, який називається:

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

Цей метод дає вам ширину / висоту вашої поверхні, і тепер ви можете використовувати:

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

з класу Bitmap . Щоб змінити розмір зображень пропорційно розміру поверхні, на яку ви малюєте.

Що вам потрібно зробити, це: якщо ви знаєте розміри вашої растрової карти по відношенню до заданого розміру екрана, наприклад, розмір екрана вашого смартфона. Потім ви можете розрахувати цільові розміри масштабованих растрових зображень. Ось математика (обгорнута в приклад):

Скажімо, у вас є Bitmap A розмірами 25x50 (ширинаxheight), який відображається на екрані розмірами 100x200 (widthxheight). Для цього розміру екрана (100x200) растрова карта має правильні розміри - тепер, якщо ви хочете відобразити растрову карту на більшому екрані, вам потрібно:

  • Обчисліть масштабний коефіцієнт для розміру растрової карти
  • Підтримуйте співвідношення сторін растрової карти (щоб вона не спотворилася)

Скажімо, що більший екран - 200x300 (ширинаxheight), тоді масштабний коефіцієнт для ширини:

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

Отже, 2 - наш масштабний коефіцієнт для значення ширини та висоти растрової карти, оскільки нам потрібно підтримувати співвідношення сторін растрової карти, ми можемо просто помножити масштабний коефіцієнт на ширину та висоту растрової карти:

bitmapWidth * 2 = scaledBitmapWidth
bitmapHeight * 2 = scaledBitmapHeight

Отже, використовуючи наш приклад растрової карти A зверху та згадану формулу, нові розміри растрових зображень будуть: 50x100 (widthxheight), оскільки:

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

Тепер, коли ми знаємо новий розмір нашої растрової карти, ми просто використовуємо виклик API, про який я згадував вище, і заповнюємо пробіли:

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

myBitmap у наведеному вище прикладі - це оригінальна растрова карта A, яка мала розміри 25x50 і масштабується до 50x100, використовуючи вищевказаний фрагмент коду.


Однак це не вирішить вашу первісну проблему програми, займаючи лише верхній правий кут пристрою розміром з планшетом. Щоб відповісти, що нам потрібні відповіді на запитання, які ми задавали вам стосовно налаштування. Я швидко підсумую їх тут:

  • Ви використовуєте ігровий движок, такий як AndEngine або Unity ?
  • Ви пишете свій макет у xml? Якщо так, то який ваш root-макет для відображення вмісту вашої гри?
  • Ви згадали, що впроваджуєте SurfaceHolder.Callback? Ширина / висота, передбачена у виклику методу surfaceChanged, дає вам розмір поверхні - це однаковий розмір, коли ваш додаток працює на смартфоні чи планшеті?
  • Чи є у вас доступ до SurfaceView (або що завгодно пов’язано з тим SurfaceHolder.Callback, який ви реалізуєте), тож ми могли б визначити, чи точно це встановлення розміру програми на розмір смартфона.
  • Чи виникають однакові проблеми із зміною розміру в емуляторі з різною роздільною здатністю екрана?

Загальна підозра: Не кожен смартфон має однаковий розмір екрану, насправді існує широкий діапазон розмірів екрану, що мене змушує замислитись: Ви коли-небудь перевіряли ваш додаток на смартфоні з іншим розміром екрана, ніж ваш екран? Тому що - той факт, що він відповідає вашому екрану, а не планшету, змушує мене замислитись, хто встановлює ці розміри і коли. Тому що я сумніваюся, що додаток може підлаштовуватися під усі розміри екрану смартфона, але не на розміри планшетів - не буде багато сенсу (адже вони більш-менш мають однакове ядро ​​для Android, яке працює на них, деякі відмінності між sx, 3). x і 4.x вбік) БІЛЬШЕ ви використовуєте рамку, яка не підтримує (з будь-якої причини - можливо, вам доведеться купувати підтримку планшетів додатково чи будь-які) розмірами екрана розміром з планшетом. Ось чому дуже важливо знати, чи правильно змінюється додаток лише на вашому телефоні, або на інших смартфонах. Єдиний спосіб, коли я знаю, як додаток може бути обмежений розміром екрана одного конкретного телефону, використовуючи AbsoluteLayout і взагалі абсолютні розміри віджетів тощо ...


ОНОВЛЕННЯ: масштабування x / y координат

Для того, щоб налаштувати розташування вашої растрової карти під розмір екрана, слід виконати щось на зразок наступного:

  • Розміри екрану: 100/200 (ширина / висота)
  • Розташування растрових зображень: x = 50 / y = 100

Тепер, якщо збільшити розмір екрана, вам доведеться масштабувати ці значення x / y уздовж:

  • Розміри екрану: 200/400 (ширина / висота)

Коефіцієнт масштабу був би 2, оскільки ширина і висота однаково збільшилися на два. Отже, розміри будуть ...

  • Розташування растрових зображень: x = 100 / y = 200

Ще одна спроба - цього разу з різними масштабними коефіцієнтами для ширини / висоти

  • Розміри екрану: 100/150 (ширина / висота)
  • Розташування растрових зображень: x = 50 / y = 50

Якщо новий цільовий екран 150/250, то розрахунки:

  • Коефіцієнт масштабу для ширини = targetWidth / originalWidth = 1,5
  • Коефіцієнт масштабу для висоти = цільВисота / оригінальнийВисота = 1,666 ... (Період)

Тепер нам потрібно масштабувати координати x / y, x масштабувати за допомогою масштабу ширини, а висоту масштабувати за допомогою шкали висоти, ось результат:

  • x = оригіналX * 1,5 = 75
  • y = оригіналY * 1.666 .. (Період) = 83.333 ... (Період)

Отже, нові розміри екрана та масштабовані координати x / y:

  • ширина = 150
  • висота = 250
  • х = 75
  • у = 83 333 ... (Період)

Щоб зробити коротку історію, алгоритм масштабування растрових зображень:

X = (targetScreenWidth / defaultScreenWidth) * defaultXCoordinate
Y = (targetScreenHeight / defaultScreenHeight) * defaultYCoordinate

У моїй грі використовується панель гри, яка розширює SurfaceHolder.Callback (Це у файлі XML, який викликається активністю). Чи може це бути частиною проблеми?
користувач1404512

@ user1404512 SurfaceHolder.Callback зазвичай пов’язаний із SurfaceView - і це також залежить від того, як налаштований SurfaceView (ширина / висота), якщо він вбудований в інший макет (наприклад, FrameLayout тощо) ... у вашому A SurfaceHolder.Callback має бути методом: public void surfaceChanged (тримач SurfaceHolder, формат int, int ширина, int висота) ширина та висота мають бути розмірами того, що малюється на екрані - що у вашому випадку буде однаковим для планшетів та смартфонів - може ти це підтверджуєш?
AgentKnopf

Так, я думаю, що слід сказати так: Коли я запускаю його на своєму планшеті, хоча розмір екрана більший, всі растрові карти мають однаковий розмір. Чи є спосіб зробити так, щоб растрові карти залишалися однаковими, навіть на екранах різних розмірів?
користувач1404512

@ user1404512 Це дуже важливо, щоб ви відповідали на всі ті запитання, які ми вам задавали, тому що ми все ще в темряві щодо того, як розроблена ваша компонування, що ускладнює відповідь на будь-яке конкретне питання. Що стосується ваших растрових зображень: я оновив свою відповідь, щоб відповісти на питання масштабування растрових фотографій найкращим чином, враховуючи, що про ваше налаштування відомо дуже мало.
AgentKnopf

Ні, я не використовую ігровий движок. У мене є макет у xml, а у моєму xml-файлі у мене є SurfaceHolder.Callback - це весь екран. Ширина та висота тримача змінюються від екрана до екрана. Я думаю, що моя проблема полягає в тому, що я малюю растрові карти з координатами X і Y, але масштаб растрових зображень залишається однаковим від екрана до екрана. Чи можна це виправити? Заздалегідь дякую!
user1404512

3

На Android.com є добра та відповідна стаття: http://developer.android.com/guide/practices/screens_support.html

Ця довідка допомагає сортувати розмір екрана, щільність екрана та роздільну здатність. Мета полягає в тому, щоб використовувати API Android для досягнення «незалежності», щоб компоненти та графіки вашого користувальницького інтерфейсу могли добре виглядати на різних пристроях.

Пам’ятайте, що ви також можете створювати різні конфігурації віртуальних пристроїв Android для емулятора під час тестування макета та зовнішнього вигляду: http://developer.android.com/guide/developing/devices/emulator.html


0

Тут просто постріл у темряві. Чи встановили ви будь-який основний макет для заповнення батьків і по вертикалі, і по горизонталі?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.