Android нескольких размеров экрана с одинаковой плотностью
Я запутался в отношении плотности. Я вижу, что при средней плотности разрешение экрана может быть 320х480, 480х800 или 480х854. Итак, если у меня есть изображение шириной 300px в папке mdpi, как оно будет выглядеть одинаково на всех 3 разных размерах экрана (в основном 320x480 по сравнению с двумя другими)? Под одинаковым размером я подразумеваю масштаб, который будет больше или меньше в зависимости от размера экрана. Благодарю.
6 ответов
Здесь необходимо понимать три различных, но связанных понятия: плотность экрана (пиксели на дюйм / сантиметр или общеизвестный как 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, оно будет абсолютно одинакового размера, независимо от разрешения экрана, при условии, что все они имеют одинаковую плотность. Что изменится, так это то, сколько места вокруг них, например, изображение шириной 320x320px будет занимать большую часть экрана 320x480, но только около трети экрана 480x800. Однако, как отмечалось выше, как правило, телефоны с более высоким разрешением также имеют более плотный экран. В этом случае Android не будет искать изображение в вашей папке mdpi - он перейдет в папку hdpi, а если он не сможет найти его там, он возьмет папку по умолчанию "drawable". Затем, если вы использовали DP, он автоматически масштабирует его, или, если вы использовали PX, он оставит его как есть, и он будет выглядеть меньше.
Там! Очень длинный ответ для вас. Я надеюсь, что это имеет смысл.
Для полноты, также проверьте эти опции для управления макетом:
Спецификаторы каталогов:
Размер: маленький, нормальный, большой Плотность: ldpi, mdpi, hdpi, nodpi(без автоматического масштабирования) Соотношение сторон: длинный, не длинный Ориентация: земляИспользование:
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: поддержка нескольких экранов
Итак, если у меня есть изображение шириной 300px в папке mdpi, как оно будет выглядеть одинаково на всех 3 разных размерах экрана (в основном 320x480 по сравнению с двумя другими)?
Внешний вид изображения зависит от плотности экрана, а не от размера экрана. Ваш -mdpi
папка не привязана к размеру экрана - она привязана к плотности экрана.
Не могли бы вы подтвердить формулу для расчета плотности экрана?
Как я прочитал, следующая формула:
Плотность = 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) одинакова.
Не могли бы вы подтвердить?
Спасибо, Рам
Вот для чего нужны независимые от устройства пиксели (DIP). Вместо 320px
записывать 320dip
,
http://developer.android.com/guide/practices/screens_support.html
На самом деле код для расчета физического размера экрана для устройств следующий:
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);