Подтвердить что ты не робот

Как поддерживать все различные разрешения продуктов Android

Все различные разрешения различных продуктов Android приводят меня в бешенство.

Мое первое приложение для Android, которое я написал, было разработано так, что оно поддерживало три широко используемых разрешения: 240x320 (LDPI), 320x480 (MDPI) и 480x800 (HDPI). 480x854 не навредил макету, поскольку он имеет ту же ширину, что и 480x800.

Я также купил следующие устройства для тестирования приложений для Android: Samsung Galaxy Europe (LDPI) HTC Desire Z (HDPI)

К счастью, моя девушка имеет HTC Wildfire S (MDPI), поэтому у меня есть большинство разрешенных резолюций.

Но сегодня мой брат загрузил мое приложение на его новом HTC Sensation, которое имеет еще одно разрешение 540x960 (HDPI?). Который не показывал мое приложение так, как должно, и, вероятно, большинство планшетов также не покажут его правильно.

Что я сделал с моим первым приложением, была зачитана плотность, а затем заданы параметры:

public void set_ui_parameters() {
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);

    if(metrics.densityDpi == DisplayMetrics.DENSITY_HIGH){
        textSize   = 35;    
        timeWidth  = 80;
        dayWidth   = 110;
        moneyWidth = 50;
    } else if(metrics.densityDpi == DisplayMetrics.DENSITY_MEDIUM){
        textSize   = 35;    
        timeWidth  = 53;
        dayWidth   = 73;
        moneyWidth = 33;
    } else if(metrics.densityDpi == DisplayMetrics.DENSITY_LOW){
        textSize   = 28;
        timeWidth  = 40;
        dayWidth   = 55;
        moneyWidth = 25;
    }
}

Помимо параметров, я также создал чертежи для LDPI, MDPI и HDPI. Это отлично подходит для описанных выше разрешений, но это зависит от разрешения экрана i.c.w. размер экрана и не удается, например, HTC sensatoin с 540x960.

Я знаю, что не все резолюции используются часто, но я хотел бы поддержать как можно больше. Статистика размеров экрана и плотности

Я несколько раз читал Поддержка нескольких экранов, но не нашел четкого ответа на эту "проблему".

Так что я должен прочитать разрешение и установить параметры в соответствии с разрешениями вместо плотности? Это разумная вещь, или как вы справляетесь с этим?

Большое спасибо за вашу информацию!

4b9b3361

Ответ 1

Вам не нужно делать это для поддержки разных плотностей. Вы создаете папки с различными ресурсами:

res/values-ldpi/dimens.xml
res/values-mdpi/dimens.xml
res/values-hdpi/dimens.xml

Затем Android решит, какой файл использовать. У вас может быть что-то вроде:

<!-- in values-ldpi/dimens.xml -->
<dimen name="textSize">25dip</dimen>

и..

<!-- in values-mdpi/dimens.xml -->
<dimen name="textSize">20dip</dimen>

и т.д.. И вы не должны заботиться о разрешении... есть много разных размеров разрешения, поэтому было бы чертовски принимать решения на основе этого.

Кроме того, если вы используете dp вместо пикселей, вам вряд ли когда-либо придется создавать разные файлы измерений для каждой плотности. Конечно, иногда вам приходится, но это зависит от приложения.

Ответ 2

Единственное, что вам нужно сделать, это установить Android файл: minSdkVersion на 7 или выше в файле манифеста. Возможно ли, что некоторые представления будут немного отличаться, но приложение применимо и на всем экране.

Ответ 3

Теперь я просто угадываю, так как остальная часть реализации не показана, но я предполагаю, что вы используете эти производные измерения как px

Взгляните на dp. Это существенно делает все то, что вы делали, автоматически, для любого устройства. (Независимый от устройства пиксель)

Ответ 4

Не беспокойтесь о небольшой разнице в разрешении: 540x960 только немного больше 480x800. Дополнительное вертикальное пространство легко: это дает вам больше места для ваших списков. Для горизонтального пространства, если вы правильно обрабатываете свои макеты, у вас будет просто дополнительное дополнение (30pix ea) по бокам.

К сожалению, полноразмерные изображения (480 в ширину) представляют собой немного большую проблему. Если вам нужны пиксельные изображения, вы хотите использовать scaleType = "center", чтобы изображения центрировались, но не масштабировались. Если вы хотите получить полную ширину, вы можете использовать scaleType = "fitCenter", чтобы заполнить его. Это будет немного нечетким... но так много всего на Android: -)

Ответ 5

Я столкнулся с этой проблемой, кроме моего приложения, это игра, в которой есть один холст SurfaceView, который я рисую фоновыми изображениями и спрайтами (например, с примером LunarLander).

То, как вы справляетесь с этим, заключается в том, чтобы расширить фоновое изображение до максимального размера, который вы хотите поддержать (540x960), но вы сохраняете все важные вещи (например, кнопки, текст, информацию и т.д.) в меньшем прямоугольнике 480x800, Вы можете расширить изображение самостоятельно или просто добавить границы. Ключ в том, что ничего важного нет.

Люди с телефонами 480x800 увидят ваше обычное приложение. Люди с телефонами 540x960 увидят немного дополнительную границу.