Страницы

Поиск по вопросам

Показаны сообщения с ярлыком dpi. Показать все сообщения
Показаны сообщения с ярлыком dpi. Показать все сообщения

среда, 22 января 2020 г.

DPI виртуализация

#windows #масштабирование #dpi


Что конкретно обозначается под DPI, когда речь идёт о масштабировании интерфейса?
Простое определение: dpi - это количество точек на дюйм бумаги при печати. Не совсем
ясна суть, когда речь идёт о методе виртуализации DPI в Windows. Чем больше это значение
указываешь в настройках, тем крупнее становится изображение. Но в чём логика, если
точек на дюйм становится больше, а изображение не становится от этого меньше - всё
наоборот.

Возьмём для примера отрисовку линии длиной 96 пикселей. DPI системы равен 120, PPI
- 144. Какова будет длина линии в дюймах? Ответ: 5/6 дюйма. Но как это работает?
    


Ответы

Ответ 1



DPI в Windows - это число пикселей на логический дюйм, а не физический. Нет смысла на его основе пытаться вычислить "размер чего-то в дюймах", так как эта настройка на самом деле предназначена для обратного, вычисления "размера чего-то в пикселях". Логический дюйм задается как высота строки 72-го шрифта. Тогда высота строки N-го шрифта в пикселях определяется формулой: DPI * N / 72 Отсюда и происходит увеличение размеров. Разумеется, шрифт здесь только для примера. Масштабирование DWM затрагивает не только шрифты, все линейные размеры элементов UI увеличиваются на фиксированный масштабный коэффициент, равный DPI / 96. Подробная информация: DPI and Device-Independent Pixels

воскресенье, 12 января 2020 г.

Как раскидать картинки по папкам mdpi, hdpi, xhdpi, ldpi?

#java #android #android_sdk #dpi


Объясните мне, пожалуйста, принцип того, как раскидать картинки по папкам mdpi, hdpi,
xhdpi, ldpi. Вот у меня есть картинка размером 800x1280, как мне узнать, какой у нее
dpi, чтобы  от него уже делать выводы, куда кидать... Я знаю, что ldpi = 0.75, mdpi
= 1.0, hdpi = 1.5, xhdpi = 2.0.

Я просто хочу делать программы под разные экраны, но как делать, не знаю.
    


Ответы

Ответ 1



dpi - зависит от разрешения экрана в пикселах и его физического размера в дюймах. Как узнать? Есть экран девайса 800 на 1280, (800Х800)+(1280Х1280) извлекаем корень = 1509,4. Теперь магия. Если экран 4,7", то 1509,4/4,7 = 321 DPI ~ xhdpi (2.0), если хотим вашу картинку на весь экран на этом девайсе, то кладём её в xhdpi - это будет как бы базовый девайс. Для дугих девайсов кладём в mdpi картинку (400 на 640), в hdpi картинку (600 на 960) и так далее. Обновление Это на 100% работает в идеальном мире. ) Уж очень разные экраны бывают. "Но ведь не может быть в mdpi базовым 800 на 1280" на экране в 9,4", будет. Можете пересчитать. ) Можно прикинуть примерно и посмотреть на эмуляторе или в редакторе xml, как это будет выглядеть на разных девайсах. Вы можете закинуть эту картинку, не изменяя во все папки и тоже посмотреть, что будет. Android растянет или сожмёт. НО память будет не оптимально расходоваться. Не кидайте все картинки только в mdpi, на девайсах с высоким DPI некоторые (особенно большие) после принудительного увеличения могут очень много памяти съедать.

Ответ 2



Оригинальную картинку надо масштабировать и ложить так: ldpi=36*36 mdpi=48*48 hdpi=72*27 xhdpi=96*96 xxhdpi=144*144 xxxhdpi=192*192 А аппарат сам выберет какую из них показывать, не думай обо всяких dpi, ось сама о них позаботится Update Про картинки. Берете картинку в лучшем разрешении и объявляете ее xxxhdpi, далее по нисходящей масштабируете на *dpi сохраняя коэффициент сжатия аналогичный иконкам приведенным выше.

Ответ 3



@xTIGRx, могу Вам посоветовать воспользоваться сайтом. На нем Вы сможете переделать любую картинку под все необходимые Вам форматы за раз. Единственное неудобство этого сайта - готовые картинки называются ic_launcher. То есть приходит переименовывать каждую перед перемещением в проект.

четверг, 5 декабря 2019 г.

Как получить точную плотность пикселей на Android

#java #android #screen #display #dpi


Как можно на Android получить точную плотность пикселей?

Сейчас использую следующий код:

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);
Log.d("debug", "Screen inches : " + screenInches); 


Его минус в том, что dm.xdpi и dm.ydpi возвращают не точные значения плотности, а
табличную плотность, к которой наиболее близка реальная плотность.

В моем случае телефон 5 дюймов 720*1280, реальная плотность 294, но код выдает мне
плотность на уровне 320 и, как следствие, неверный размер экрана в дюймах. 

Как мне получить реальную плотность?
    


Ответы

Ответ 1



Судя по выдаче гугла на запросы по теме решения этой задачи не существует. Видимо придётся вам либо как-то без точной информации выживать, либо привлекать юзеров к вычислению. Т.е. помещать на экран предполагаемый по размеру круг (который должен быть размером с к-л популярную монету) и просить юзера жать на к-л кнопки для подгона круга на экране к размерам монеты. Иного способа получить совсем точные параметры экрана нет. И не будет, т.к. никто не в силах помешать производителям железа создавать экраны с произвольными характеристиками и править системные API

Ответ 2



Ох уж это разнообразие размеров экранов... Давайте разбираться как работает AIDA64. Нужно отдать им должное, у них очень большая база устройств с еще не менее малым числом уточнений для конкретных моделей. У меня получилось высчитать такие же значения для тестового телефона Xiaomi Redme Note 3 Pro. Вот что у меня получилось: float my_LCD_Diagonal = 5.5f; WindowManager windowManager = activity.getWindowManager(); Resources res = activity.getResources(); Display display = null; DisplayMetrics displayMetrics = null; if(windowManager != null) { display = windowManager.getDefaultDisplay(); } if(res != null) { displayMetrics = res.getDisplayMetrics(); } if(display != null && displayMetrics != null) { float xdpi = displayMetrics.xdpi; float ydpi = displayMetrics.ydpi; if (Build.VERSION.SDK_INT >= 17) { Point point = new Point(); display.getRealSize(point); screenWidthPx = point.x; screenHeightPx = point.y; } int roundedXdpi = Math.round(xdpi); int roundedYdpi = Math.round(ydpi); float diagonal_ppi= ((float)(Math.sqrt(((double)(screenWidthPx * screenWidthPx + screenHeightPx * screenHeightPx))) / (((double)SystemInfo.DB_LCD_Diagonal)))); if(diagonal_ppi> 1f) { ydpi = diagonal_ppi; xdpi = diagonal_ppi; } if(screenWidthPx > 0 && screenHeightPx > 0 && xdpi > 1f && ydpi > 1f) { float xmm = (((float)screenWidthPx)) / xdpi * 25.4f; float ymm = (((float)screenHeightPx)) / ydpi * 25.4f; float diagonal_in_inch = (((float)Math.sqrt(((double)(xmm * xmm + ymm * ymm))))) / 25.4f; String res_dpi = String.format(Locale.getDefault(), "%d %s", Math.round((((float)Math.sqrt(((double)(screenWidthPx * screenWidthPx + screenHeightPx * screenHeightPx))))) / diagonal_in_inch), "dpi"); } } P.S. В результате получилось значение в res_dpi "401 dpi". P.P.S. Ввел данные, которые привел автор вопроса, получил значение "294 dpi". Но этот алгоритм будет работать не для всех моделей телефонов!!! Потому как должны быть внесены поправки.

суббота, 9 марта 2019 г.

Как раскидать картинки по папкам mdpi, hdpi, xhdpi, ldpi?

Объясните мне, пожалуйста, принцип того, как раскидать картинки по папкам mdpi, hdpi, xhdpi, ldpi. Вот у меня есть картинка размером 800x1280, как мне узнать, какой у нее dpi, чтобы от него уже делать выводы, куда кидать... Я знаю, что ldpi = 0.75, mdpi = 1.0, hdpi = 1.5, xhdpi = 2.0
Я просто хочу делать программы под разные экраны, но как делать, не знаю.


Ответ

dpi - зависит от разрешения экрана в пикселах и его физического размера в дюймах. Как узнать? Есть экран девайса 800 на 1280, (800Х800)+(1280Х1280) извлекаем корень = 1509,4. Теперь магия. Если экран 4,7", то 1509,4/4,7 = 321 DPI ~ xhdpi (2.0), если хотим вашу картинку на весь экран на этом девайсе, то кладём её в xhdpi - это будет как бы базовый девайс. Для дугих девайсов кладём в mdpi картинку (400 на 640), в hdpi картинку (600 на 960) и так далее. Обновление Это на 100% работает в идеальном мире. ) Уж очень разные экраны бывают. "Но ведь не может быть в mdpi базовым 800 на 1280" на экране в 9,4", будет. Можете пересчитать. ) Можно прикинуть примерно и посмотреть на эмуляторе или в редакторе xml, как это будет выглядеть на разных девайсах. Вы можете закинуть эту картинку, не изменяя во все папки и тоже посмотреть, что будет. Android растянет или сожмёт. НО память будет не оптимально расходоваться. Не кидайте все картинки только в mdpi, на девайсах с высоким DPI некоторые (особенно большие) после принудительного увеличения могут очень много памяти съедать.