После многих лет работы с макетами Android, специфичными для пикселей, я наткнулся на квалификатор «nnndpi». Я не смог специально настроить Samsung Galaxy S8, чтобы отделить его от других устройств, извлекающих из папки sw360dp-xxxhdpi. Sw360dp-xxxhdpi также нацелен на S7, поэтому два устройства фактически показывают определенные элементы экрана как примерно 60dp при определении marginLeft в файле xml.
Я попытался определить h740dp и h740dp-xxxhdpi, 568dpi, 142dpi и несколько других вариантов, которые я придумал из этого замечательного ресурса спецификации устройства: https://material.io/tools/devices
Я не смог нацелиться на S8 и думаю, что должен быть способ нацелить это конкретное устройство и любое другое устройство на рынке (независимо от того, является ли это плохой конструктивной практикой).
@TheWanderer Я знаю, что это не лучшая практика дизайна, как я сказал в вопросе, просто хотел знать, как использовать квалификатор nnndpi, поскольку он предоставлен нам Google




Экран 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 .. Попробую сейчас
После некоторого тестирования layout-sw360dp-w668dp-xxxhdpi заработал! Я думал, что по крайней мере один из них был неправильным, так как вы написали layout-sw360dp-h668dp-xxxhdpi в своем ответе ... можно было бы подумать, что sw и w в имени отменят или вызовут ошибку ... дикий крутой ответ, мой друг. . меняет все для нацеливания на определенные устройства
layout-h740dp не работал для галактики s8
@jairhumber, чтобы увидеть мое объяснение в ответе; вам придется вычесть что-то вроде 72dp или более, чтобы компенсировать статус и панель навигации.
@BenP. неожиданное решение! У меня аналогичная проблема, макет на устройствах 16: 9 xxxhdpi в порядке, но на устройствах 18: 9 xxxhdpi - нет. Последний - LG G6. Любые догадки, как настроить таргетинг на этот размер экрана (1440 x 2880). Я пробовал с nnndpi (layout-564dpi) и с layout-sw360dp-h2802dp-xxxhdpi (пытаясь следовать вашим инструкциям), но мне это не удалось. Любые идеи?
@Eir Предполагая, что плотность равна 3,5, экран 1440x2880 будет иметь размер 411x822 dp. Так что вы можете попробовать layout-sw411dp-h750-xxxhdpi. Наименьшая ширина - 411, потому что она всегда равна 411dp (как минимум), а доступная высота - 750, потому что это 822 минус 24 для строки состояния и минус 48 для панели навигации.
@BenP. Большое спасибо! Все равно не улавливаешь ... Как определить плотность? В спецификациях указано: 5,7-дюймовый (1440 x 2880) QHD + FullVision® IPS Quantum Display, и дополнительно: соотношение 18: 9 (плотность ~ 564 ppi). Если у вас есть какие-либо рекомендации, в каком направлении я мог бы продолжать попытки, дайте мне знать. Спасибо!
Значение плотности, о котором я упоминал, берется путем деления реальной плотности пикселей на 160. Если ppi для вашего экрана 564, тогда 564/160 = 3.525. Затем вы можете вычислить размеры dp, разделив размеры в пикселях на это значение, то есть 1440/3.525=408.51 (поэтому, вероятно, с округлением до 408 или 409dp). тем не мение, плотность пикселей устройства настоящий (564 для вас) часто равна нет, которую Android использует для своих математических расчетов ... возьмите экземпляр DisplayMetrics и проверьте, как указано в списке density. Это - вещественное число, которое Android использует для вычислений.
@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, но ничего не вышло. Если вам очевидно, в чем будет заключаться магическая формула, дайте мне знать. В противном случае я постараюсь разобраться в этом завтра.
Итак, значение dpi - 640, ширина - 1440px, а высота - 2672px. 640/160 = 4, поэтому ширина - 1440px / 4 = 360dp, а высота - 668dp. Все вместе это даст вам layout-sw360dp-h668dp-xxxhdpi ... но то, что у вас было, тоже должно работать, так что я немного озадачен.
@BenP. Я просто хотел опубликовать эпилог. Я закончил рендеринг макета в изображении. Это определенная часть моего приложения, которая может справиться с этим. Намного проще и намного лучше.
Вы не должны создавать макеты для конкретных устройств. Классификации нужны для того, чтобы макеты работали с общими техническими характеристиками устройства. Вы должны использовать значения
dpдля ваших размеров, а не px.