Якщо ви не використовуєте AbsoluteLayout (Зазвичай це дуже погана ідея, оскільки ви розробляєте макет за допомогою координат x / y, який буде відповідати лише пристрою, на якому він був розроблений), цього не повинно відбуватися - програми Android автоматично підлаштовуються під розмір екрану пристрою. . Однак з того, що ви описуєте (макет не налаштовано на екран таблиці), це здається, що тут може виникнути проблема AbsoluteLayout.
Переконайтеся, що у форматі XML-файлів ви НЕ використовуєте абсолютних макетів (це включає встановлення явних координат / ширини / висоти для будь-якого виду перегляду). Замість цього подумайте про використання:
... що найкраще відповідає вашим цілям.
Якщо ви не новачок в 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