Использование nnndpi для папок макета Android

После многих лет работы с макетами Android, специфичными для пикселей, я наткнулся на квалификатор «nnndpi». Я не смог специально настроить Samsung Galaxy S8, чтобы отделить его от других устройств, извлекающих из папки sw360dp-xxxhdpi. Sw360dp-xxxhdpi также нацелен на S7, поэтому два устройства фактически показывают определенные элементы экрана как примерно 60dp при определении marginLeft в файле xml.

Я попытался определить h740dp и h740dp-xxxhdpi, 568dpi, 142dpi и несколько других вариантов, которые я придумал из этого замечательного ресурса спецификации устройства: https://material.io/tools/devices

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

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

TheWanderer 30.10.2018 00:39

@TheWanderer Я знаю, что это не лучшая практика дизайна, как я сказал в вопросе, просто хотел знать, как использовать квалификатор nnndpi, поскольку он предоставлен нам Google

whyoz 30.10.2018 00:54
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
256
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Экран Samsung Galaxy S8 имеет разрешение 360dp x 740dp при xxxhdpi. Квалификаторы ресурсов, которые можно использовать для таргетинга на этот экран:

  • sw360dp (наименьшая ширина) - S8 будет соответствовать этому всегда
  • w360dp (доступная ширина) - S8 будет соответствовать этому независимо от ориентации (так как у него будет намного больше, чем 360dp ширины в альбомной ориентации)
  • h740dp (доступная высота) - S8 будет соответствовать этому в портретной ориентации (хотя и не совсем; подробнее см. Ниже)
  • xxxhdpi (плотность пикселей) - S8 всегда будет соответствовать этому

Проблема с квалификатором h740dp заключается в том, что квалификаторы «доступная ширина / высота» не дают вам физического размера экрана; они вычитаются для постоянного пользовательского интерфейса, такого как строка состояния и панель навигации. Строка состояния обычно имеет размер 24 dp, а панель навигации больше (часто 48 dp или больше), но ни то, ни другое не гарантируется (и если вы используете fitsSystemWindows или иным образом скрываете эти панели, вы можете получить другие результаты).

Вдобавок ко всему, любой «таргетинг», который вы делаете на основе размера экрана, всегда будет иметь потенциал для нацеливания на другие устройства, поскольку ничто не мешает LG создать телефон с экраном xxxhdpi, который имеет разрешение не менее 360x740dp.

Вместе это означает, что вы не должны делать то, что делаете. Но если вы должны это сделать, я бы попробовал этот набор квалификаторов: layout-sw360dp-h668dp-xxxhdpi для портретной ориентации (вы можете поэкспериментировать с точным числом, которое будет использоваться для hXXXdp для учета полос состояния и навигации) и layout-sw360dp-w740dp-xxxhdpi для альбомной ориентации.

Какой отличный ответ ... удачи найти этот синтаксис папки макета в Интернете, кроме здесь! Я пробовал layout-h740dp-land-xxxhdpi .. Попробую сейчас

whyoz 30.10.2018 06:41

После некоторого тестирования layout-sw360dp-w668dp-xxxhdpi заработал! Я думал, что по крайней мере один из них был неправильным, так как вы написали layout-sw360dp-h668dp-xxxhdpi в своем ответе ... можно было бы подумать, что sw и w в имени отменят или вызовут ошибку ... дикий крутой ответ, мой друг. . меняет все для нацеливания на определенные устройства

whyoz 30.10.2018 07:45

layout-h740dp не работал для галактики s8

jairhumberto 04.10.2019 05:57

@jairhumber, чтобы увидеть мое объяснение в ответе; вам придется вычесть что-то вроде 72dp или более, чтобы компенсировать статус и панель навигации.

Ben P. 04.10.2019 06:31

@BenP. неожиданное решение! У меня аналогичная проблема, макет на устройствах 16: 9 xxxhdpi в порядке, но на устройствах 18: 9 xxxhdpi - нет. Последний - LG G6. Любые догадки, как настроить таргетинг на этот размер экрана (1440 x 2880). Я пробовал с nnndpi (layout-564dpi) и с layout-sw360dp-h2802dp-xxxhdpi (пытаясь следовать вашим инструкциям), но мне это не удалось. Любые идеи?

Eir 20.04.2020 19:28

@Eir Предполагая, что плотность равна 3,5, экран 1440x2880 будет иметь размер 411x822 dp. Так что вы можете попробовать layout-sw411dp-h750-xxxhdpi. Наименьшая ширина - 411, потому что она всегда равна 411dp (как минимум), а доступная высота - 750, потому что это 822 минус 24 для строки состояния и минус 48 для панели навигации.

Ben P. 20.04.2020 20:01

@BenP. Большое спасибо! Все равно не улавливаешь ... Как определить плотность? В спецификациях указано: 5,7-дюймовый (1440 x 2880) QHD + FullVision® IPS Quantum Display, и дополнительно: соотношение 18: 9 (плотность ~ 564 ppi). Если у вас есть какие-либо рекомендации, в каком направлении я мог бы продолжать попытки, дайте мне знать. Спасибо!

Eir 20.04.2020 20:49

Значение плотности, о котором я упоминал, берется путем деления реальной плотности пикселей на 160. Если ppi для вашего экрана 564, тогда 564/160 = 3.525. Затем вы можете вычислить размеры dp, разделив размеры в пикселях на это значение, то есть 1440/3.525=408.51 (поэтому, вероятно, с округлением до 408 или 409dp). тем не мение, плотность пикселей устройства настоящий (564 для вас) часто равна нет, которую Android использует для своих математических расчетов ... возьмите экземпляр DisplayMetrics и проверьте, как указано в списке density. Это - вещественное число, которое Android использует для вычислений.

Ben P. 20.04.2020 21:07

@BenP. Спасибо! Я еще не там. Я вижу эти значения: [density = 4.0, densityDpi = 640, heightPirxels = 2672, noncompatDensity = 4.0, noncompatDensityDpi = 640, noncompatHeightPixels = 2672, noncompatScaledDensity = 4.0, noncompatWidthPixels = 1440, noncompatXdpialed = 562.707, несложного widthPixels = 1440, xdpi = 562,707, ydpi = 562,707]. Итак, я попробовал layout-sw360dp-h648dp-xxxhdpi, но ничего не вышло. Если вам очевидно, в чем будет заключаться магическая формула, дайте мне знать. В противном случае я постараюсь разобраться в этом завтра.

Eir 20.04.2020 21:55

Итак, значение dpi - 640, ширина - 1440px, а высота - 2672px. 640/160 = 4, поэтому ширина - 1440px / 4 = 360dp, а высота - 668dp. Все вместе это даст вам layout-sw360dp-h668dp-xxxhdpi ... но то, что у вас было, тоже должно работать, так что я немного озадачен.

Ben P. 20.04.2020 22:07

@BenP. Я просто хотел опубликовать эпилог. Я закончил рендеринг макета в изображении. Это определенная часть моего приложения, которая может справиться с этим. Намного проще и намного лучше.

Eir 26.04.2020 09:19

Другие вопросы по теме