Ну, кажется, вы уже обнаружили, почему у них есть различия, потому что они сообщают о разных масштабных коэффициентах плотности:
- Nexus 7: TVDPI: коэффициент масштабирования = 1,333.
- Kindle Fire HD: HDPI: коэффициент масштабирования = 1,5
Почему же они сообщаются по-разному, хотя технически имеют одинаковый физический размер и разрешение?
Проблема CORE на самом деле существует, потому что одно устройство является устройством Google Play (Nexus), а другое — нет (Kindle). Все устройства Android, на которых есть Google Play (и другие приложения Google), могут сделать это, только пройдя нечто, называемое набором тестов совместимости (CTS), который проверяет, соответствуют ли такие настройки стандартам, которые они выдвинули. Сами стандарты задокументированы в документе определения совместимости (CDD) для каждой версии. Вот ссылка на CDD для Android 4.0 (раздел 7.1 имеет дело с размером экрана и плотностью). CDD сообщает производителю устройства, что он должен сообщать коэффициент масштабирования, который в числовом отношении наиболее близок к фактическому DPI экрана, который в данном случае фактически является TVDPI.
Устройства Amazon не используют никакие приложения Google, включая Google Play. Хотя в их интересах следовать одним и тем же стандартам, они не связаны ими и часто не соблюдаются. Когда TVDPI появился на Nexus 7, он прокрался ко всем, но Amazon знал бы об этом, если бы они ссылались на CDD во время разработки.
Как это влияет на их поведение?
Различия не в вашем выборе макета. Судя по вашим снимкам экрана, оба устройства получают правильное расположение, как вы и ожидаете. Изменение значения sw
в каталоге макета влияет только на то, какие устройства будут выбирать этот макет... это ничего не меняет в том, как все будет масштабироваться. Не утруждайте себя попыткой разместить макеты в каталогах с определенной плотностью... макеты должны быть гибкими.
Вместо этого проблема заключается в любом расчете размера или размера, сделанном для единиц пикселей, не зависящих от плотности (т.
Поскольку эти два устройства решили по-разному масштабировать активы, любой используемый вами ресурс рисования или любое значение, которое вы определяете в "dp", приведет к небольшому изменению. Приведу два примера:
Вы определяете размер текста для TextView
равным 16dp
. На Nexus 7 текст будет отображаться размером 21 пиксель. Kindle Fire HD будет рисовать тот же текст с разрешением 24 пикселя. Разница небольшая... но она есть.
То же самое верно и для рисуемых изображений. Если вы определили только изображение в формате drawable-mdpi
с разрешением 48 x 48 и такое же изображение в формате drawable-hdpi
с разрешением 72 x 72, Kindle будет использовать непосредственно изображение размером 72 пикселя, а Nexus создаст масштабированное изображение размером 64 пикселя, поэтому между двумя активами будет разница в 8 пикселей. .
Что я могу сделать, чтобы они выглядели более похожими?
В большинстве случаев я бы сказал, что не стоит. Обычно сделанное масштабирование не сильно влияет на результат приложения, если ограничения макета не установлены со слишком большим количеством жестко запрограммированных размеров.
Однако, как правило, если есть части вашего пользовательского интерфейса, которые вам нужно специально изменить для этой цели, решение состоит в том, чтобы определить конкретные ресурсы и размеры для -tvdpi
случая, когда вы считаете, что они необходимы (опять же, я бы не рекомендовал масштабировать ВСЕ в вашем приложении, чтобы удовлетворить этот случай).
Для таких вещей, как размер текста или представления, это означает, что вам может понадобиться файл values-tvdpi/dimensions.xml
и файл values/dimensions.xml
по умолчанию. Используя приведенный выше пример, вы можете определить размер текста по умолчанию как 16dp, но в расположении -tvdpi
определите тот же размер, что и 18dp. Это заставит оба устройства масштабировать окончательный текст до 24 пикселей. В коде, где используется фактический размер, ссылайтесь на него как @dimen/myTextSize
, а не 16dp
напрямую.
Для элементов, которые можно рисовать, добавьте каталог drawable-tvdpi
и масштабируйте эти ресурсы, чтобы они соответствовали тому, как, по вашему мнению, они должны отображаться на таких устройствах, как Nexus 7. Опять же, в нашем предыдущем примере, скопируйте тот же файл изображения из папки drawable-hdpi
в папку drawable-tvdpi
, чтобы оба устройства нарисуйте то же изображение в 72px.
Чтобы избежать копирования одного и того же актива в нескольких местах, вы также можете сделать это с помощью псевдонимов. Помещение самого изображения в drawable/
со специальным именем и использование values-tvdpi/drawables.xml
и values-hdpi/drawables.xml
для ссылки на один ресурс в двух местах. Дополнительные сведения об использовании псевдонимов см. в этой документации. Примеры предназначены для макетов, но та же парадигма работает для чертежей (или любых ресурсов), заменив их на type="drawable"
.
person
devunwired
schedule
28.11.2012