Минимальная высота кнопки Android: 48 дп = 9 мм?
В настоящее время я работаю над каркасами для мобильного приложения, и есть что-то, что, кажется, ускользает от меня. В Руководстве по дизайну Android они заявляют следующее:
В среднем 48dp переводят на физический размер около 9 мм (с некоторыми изменчивость).
Но, согласно Android Developers Dev Guide, они вычисляют dp
по следующей формуле:
Не зависящий от плотности пиксель эквивалентен одному физическому пикселю на 160 т/д, что является базой плотности, принятой системой для экрана средней плотности. Во время выполнения система прозрачно обрабатывает любое масштабирование блоков dp, если необходимо, на основе фактического плотность используемого экрана. Преобразование блоков dp в экран пикселы просты: px = dp * (dpi/160). Например, на 240 dpi screen, 1 dp равно 1,5 физическим пикселям. Вы всегда должны использовать dp при определении пользовательского интерфейса приложения, чтобы обеспечить правильное отображение ваш пользовательский интерфейс на экранах с различной плотностью.
Итак, скажем, что для простоты я делаю свой проект на 160 dpi, поэтому мои графики имеют нужный размер в соответствии с рекомендованными стандартами. При печати я уменьшаю свой документ на 2,22 (160dpi/72dpi), поэтому напечатанный результат дает фактический физический размер на бумаге.
Я хочу, чтобы мои кнопки были на 48dp выше. Но если я занимаюсь математикой, следуя всем, что я читаю, я нигде не близок к размеру 9 мм, указав 48 в качестве высоты своей кнопки.
48dp/160dpi = 0,3 дюйма, поэтому 7,62 мм...
Чего я явно не вижу/делаю неправильно? Откуда это 9мм?
Спасибо!
Обновление
Вот что помогло мне понять, чего я не понял из принятого ответа.
Возьмем в качестве примера плотность экрана 200. Android будет использовать 240 для расчета. Итак:
- 240dpi/160dpi = 1,5 шкалы
- 48dp * 1,5 of scale = 78 физических пикселей
- 78 px/240dpi = 0,3 дюйма (что точно так же, как 48dp/160dpi)
Теперь фокус в том, что фактическая плотность устройства была 200. Таким образом, пиксели будут отображаться больше, чем на экране 240 точек на дюйм. Чтобы получить физический размер устройства 200dpi, мы должны получить разницу между обоими разрешениями и применить его к 0,3 дюйма:
- 240dpi/200dpi = 1,2
- 0,3 в * 1,2 разницы = 0,36 дюйма, что дает 9144 мм
Я знаю, что это точно так же, как указано @kabuko:
(48dp/200ppi) * 1,5 * 25,4 мм/дюйм = 9,144400
но шаг за шагом помог мне разобраться, что происходит под капотом.
Ответы
Ответ 1
Точный оператор, на который вы ссылаетесь:
В среднем, 48dp переводят на физический размер около 9 мм
Если вы посмотрите на это изображение из документа Поддержка нескольких экранов:
![Android Densities]()
Вы увидите, что есть ведра плотности (ldpi, mdpi, hdpi, xhdpi). Каждая из них не является фиксированной плотностью, а скорее диапазоном плотностей, которые заканчиваются отображением на фиксированные числа, используемые для различных вычислений плотности (120, 160, 240, 320 соответственно). 160 редко являются фактическими пикселями на дюйм для устройства mdpi, это просто абстрагированное значение, используемое для простоты.
Ваши вычисления верны, но вы предполагаете, что 160ppi - средняя плотность (при условии, что устройства mdpi) только потому, что 160dpi - это абстрагированное значение для mdpi. По-видимому, это не так, если утверждение, которое вы ссылаетесь, действительно верно. Я подозреваю, что есть много устройств, которые в среднем составляют около 200ppi, которые в конечном итоге становятся категоризированными как hdpi. Это будет: (48dp/200ppi) * 1,5 * 25,4 мм/дюйм = 9,144400 мм. Просто догадаться, но, конечно, я думаю, что основная причина заключается в том, что среднее значение не равно 160ppi.
Update:
Здесь другая цитата из документа с сайта дизайна:
Если вы создаете свои элементы как минимум на 48 дп в ширину, вы можете гарантировать, что [...] ваши цели никогда не будут меньше минимального рекомендуемого размера цели 7 мм независимо от того, на каком экране они отображаются.
Таким образом, размер варьируется от > 7 мм до не менее 9 мм (при условии, что 9 мм предполагается средним, я думаю, что верхний диапазон должен составлять < 11 мм). Да, 48dp должен быть "примерно" одинакового размера на всех экранах, но то, что "приблизительно" действительно означает, на самом деле не указано. Ваш 7,62 мм находится в радиусе действия. Их значение 9 мм предназначено только для "среднего", которое является неопределенным ppi.
Ответ 2
Если говорить строго об Android-телефоне и планшетах (нет телевизора, нет Wear, нет десктопов, нет iOS):
Согласно списку устройств Google https://design.google.com/devices/ рекомендация 48dp to 9mm действительно не соответствует реальным значениям в мире.
Мне нужно было найти самое низкое значение DP, которое будет безопасно отображаться на любом физическом уровне или выше. Оказывается, некоторые устройства просто плохо настроены (Sony Experia C4 является наихудшим в этом списке на 200 дп/дюймов, далее - Dell Venue 8 при 180dp/in, затем LG G3 со скоростью 178dp/in) (здесь речь идет о логическом DP не физическом DPI). В этих устройствах все будет выглядеть меньше среднего. Все остальное близко к 170..144 dp/in.
Если эту информацию можно найти в другом месте, чтобы согласовать данные, а также иметь больше устройств, было бы неплохо, если бы мы увидели, что там есть больше устройств-изгоев.
Здесь некоторые цифры, которые я извлек из страницы: (только телефон и планшеты для Android)
Max: 200 dp/in (smallest)
Min: 141 dp/in (biggest)
С этими числами здесь приведена таблица для размера min/max mm для различных дискретных значений dp на выбор (округленная до ближайшей 1/10 мм):
dp min max mm
36 4.6 6.5
37 4.7 6.7
38 4.8 6.8
39 5.0 7.0
40 5.1 7.2
41 5.2 7.4
42 5.3 7.6
43 5.5 7.7
44 5.6 7.9
45 5.7 8.1
46 5.8 8.3
47 6.0 8.5
48 6.1 8.6
49 6.2 8.8
50 6.4 9.0
51 6.5 9.2
52 6.6 9.4
53 6.7 9.5
54 6.9 9.7
55 7.0 9.9
56 7.1 10.1
57 7.2 10.3
58 7.4 10.4
59 7.5 10.6
Формула
mm = <dp> * 25.4 / <dp/in>
где <dp/in>
является либо максимальным плотным dp/in (200), либо низким плотным (141), который я мог найти в этом списке устройств.
Пример
48dp * 25.4 / 200 = 6.096mm
округлые: 6.1 мм - что ниже "безопасных" 7 мм, они утверждают.
Также обратите внимание, что 48dp никогда не достигает "9 мм" на любом экране телефона/планшета. Макс составляет 8,6 (что близко, но, конечно, не среднее).