Android нескольких размеров экрана с одинаковой плотностью - PullRequest
40 голосов
/ 14 апреля 2010

Я в замешательстве относительно плотности. Я вижу, что при средней плотности разрешение экрана может быть 320х480, 480х800 или 480х854. Итак, если у меня есть изображение шириной 300px в папке mdpi, как оно будет выглядеть одинаково на всех 3 разных размерах экрана (в основном 320x480 по сравнению с двумя другими)? И под одинаковым размером я имею в виду масштаб, который будет больше или меньше в зависимости от размера экрана. Спасибо.

Ответы [ 6 ]

67 голосов
/ 14 апреля 2010

Здесь необходимо понимать три различных, но связанных понятия: плотность экрана (пикселей на дюйм / сантиметр или широко известная как DPI от точек на дюйм в принтерах), физический размер экрана (в дюймах или сантиметрах) и количество пикселей ( также называется разрешением в пикселях).

Эти термины не взаимозаменяемы, и вы должны понимать, как они связаны, чтобы не путать проблему. Как правило, вы можете игнорировать физический размер экрана, так как он уже учтен в плотности. Например, экран шириной 3 дюйма и шириной 300 пикселей будет иметь значение DPI 100. Кроме того, экраны телефонов обычно имеют примерно одинаковый физический размер, даже если количество пикселей сильно отличается.

Итак, давайте рассмотрим экран G1 или Hero, который имеет разрешение 480x320 и плотность около 160 точек на дюйм. Изображение шириной 300 пикселей будет иметь ширину 1,875 дюйма. Это рассчитывается по размеру пикселя (300) / плотности (160). Теперь, если сравнить это с экраном Nexus One, Droid или аналогичным, эти модели имеют экран с более высоким разрешением около 800x480 с высокой плотностью около 240 точек на дюйм. Если вы отобразите одно и то же изображение шириной 300px, оно теперь будет отображаться только физически с шириной около полутора дюймов. Другими словами, это будет намного меньше. Это может быть проблемой, потому что, если изображение содержит текст, текст может больше не читаться.

Android можно настроить автоматическое масштабирование изображений для соответствия разным экранам, чтобы они по-прежнему выглядели одинакового размера. Это делается путем установки размеров в пикселях, независимых от плотности. Если что-то шириной 100dp, то оно будет шириной 100px на экране средней плотности. На экране с высокой плотностью он будет иметь ширину 150 пикселей, но на реальном экране они будут выглядеть примерно одинаково. Однако, если вы сделаете это, ваше изображение может стать немного размытым. Это то же самое, что когда вы слишком сильно увеличиваете фотографию в программе просмотра изображений; края становятся размытыми, поскольку они растягиваются при масштабировании.

Способ решить эту проблему - использовать папки mdpi, hdpi и так далее. Вы даете Android изображение, которое уже масштабировано, так что оно не должно делать это само. Очевидно, что если вы просто растянете изображение в Photoshop самостоятельно, оно будет выглядеть не лучше. Но обычно каждый изменяет размеры очень больших изображений, чтобы они соответствовали экрану мобильного телефона. В этом случае вы просто изменяете их размер три раза, каждый в разном разрешении.

Итак, чтобы окончательно ответить на ваш конкретный вопрос: если у вас есть изображение, помещенное в папку mdpi, оно будет абсолютно одинакового размера независимо от разрешения экрана, если они имеют одинаковую плотность. Что изменится, так это то, сколько места вокруг них, например Изображение шириной 320x320 пикселей будет занимать большую часть экрана 320x480, но только около трети экрана 480x800. Однако, как отмечалось выше, как правило, телефоны с более высоким разрешением также имеют более плотный экран. В этом случае Android не будет искать изображение в вашей папке mdpi - он перейдет в папку hdpi, и если он не сможет найти его там, он возьмет папку «drawable» по умолчанию. Затем, если вы использовали DP, он автоматически масштабирует его, или если вы использовали PX, он оставит его как есть и будет выглядеть меньше.

Там! Очень длинный ответ для вас. Я надеюсь, что это имеет смысл.

8 голосов
/ 19 ноября 2010

Для полноты, также проверьте эти опции для управления макетом:

Каталог определителей:

Size:         small, normal, large
Density:      ldpi, mdpi, hdpi, nodpi(no auto-scale)
Aspect ratio: long, notlong
Orientation:  land
Использование:
res/layout/my_layout.xml            
res/layout-small/my_layout.xml      
res/layout-large/my_layout.xml      
res/layout-large-long/my_layout.xml      
res/layout-large-land/my_layout.xml     
res/drawable-ldpi/my_icon.png  
res/drawable-mdpi/dpi/my_icon.png  
res/drawable-hdpi/my_icon.png      
res/drawable-nodpi/composite.xml   

Ограничение вашего приложения определенными размерами экрана (с помощью AndroidManifest):

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
...
<supports-screens
          android:largeScreens="true"
          android:normalScreens="true"
          android:smallScreens="true"
          android:anyDensity="true" />
...
</manifest>

А для настройки уровня кода:

float scale = getContext().getResources().getDisplayMetrics().density;
И не забывайте:
dpi    = 160; //At 160dpi
pixels = dips * (density / dpi)

Это все в этом документе: developer.android.com: поддержка нескольких экранов

4 голосов
/ 14 апреля 2010

Итак, если у меня есть изображение шириной 300 пикселей в папке mdpi, как это собирается выглядят одинаково на всех 3 разных Размеры экрана (в основном 320x480 против другое 2)?

Физически внешний вид изображения определяется плотностью экрана, а не размером экрана. Ваша папка -mdpi не привязана к размеру экрана - она ​​привязана к плотности экрана.

2 голосов
/ 16 июля 2010

Не могли бы вы подтвердить формулу для расчета плотности экрана?

Как я прочитал, следующая формула:

Плотность = SQRT (wp ^ 2 + hp ^ 2) / размер экрана

wp -> ширина экрана (в пикселях) hp -> высота экрана (в пикселях) Размер экрана -> Физический размер экрана (диагональ дюймов)

Размер экрана (320x480) = SQRT (102400 + 230400) / 160 = 3,6 дюйма

Размер экрана (480x800) = SQRT (640000 + 230400) / 160 = 5,8 дюйма

Размер экрана (480x854) = SQRT (729316 + 230400) / 160 = 6,12 дюйма

Итак, макеты (экраны пользовательского интерфейса) определяются размерами экрана (маленький: <3 ", нормальный <4", большие> 5 ") и доступные для рисования ресурсы (изображения) определяются плотностью экрана.

И, размер изображения (в пикселях) не меняется, если плотность экранов (320x480, 480x800 или 480x854) одинаковы.

Не могли бы вы подтвердить?

Спасибо, Ram

1 голос
/ 14 апреля 2010

Для этого предназначены независимые от устройства пиксели (DIP). Вместо 320px напишите 320dip.

http://developer.android.com/guide/practices/screens_support.html

0 голосов
/ 10 августа 2012

На самом деле код для расчета физического размера экрана для устройств следующий:

DisplayMetrics dm = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(dm);

double x = Math.pow(dm.widthPixels/dm.xdpi,2);

double y = Math.pow(dm.heightPixels/dm.ydpi,2);

double screenInches = Math.sqrt(x+y);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...