Подтвердить что ты не робот

Nexus 7 и Kindle Fire HD, думаю, разные

Я разрабатываю приложение для планшетов 7 дюймов Kindle Fire HD и Nexus 7. Эти два приложения имеют одинаковый размер и одинаковое разрешение экрана. Тем не менее, я запускаю свое приложение, это совсем другое. Почему?

похоже, что это связано с тем, что связь 7 определяется как TVDPI, а Kindle Fire HD - HDPI. Как получить один и тот же рендеринг на основе модели 1280 * 800?

Спасибо

4b9b3361

Ответ 1

Ну, похоже, вы уже обнаружили, почему у этих двух есть различия, потому что они сообщают о различных факторах плотности плотности:

  • 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 в каталоге макета влияет только на то, какие устройства будут выбирать этот макет... он ничего не меняет о том, как все будет масштабироваться. Не беспокойтесь, пытаясь разместить макеты сами по себе в каталогах, специфичных для плотности... макеты должны быть гибкими.

Вместо этого проблема заключается в вычислении размера или размера, выполненном на не зависящих от плотности пиксельных единицах (например, dip или dp), таких как размеры текста, любые фиксированные размеры размеров, которые вы могли создать, и допустимые размеры.

Поскольку эти два устройства имеют выбранные для масштабирования активов по-разному, любой ресурс, который вы используете, или любое значение, которое вы определяете в "dp", приведет к небольшому изменению. Позвольте мне привести два примера:

Вы определяете размер текста для TextView как 16dp. На Nexus 7 это будет рисовать текст в 21px. Kindle Fire HD будет рисовать тот же текст в 24px. Разница небольшая... но она существует.

То же самое верно и для рисованных изображений. Если вы только определили изображение в drawable-mdpi на 48x48 и такое же изображение в drawable-hdpi на 72x72, Kindle имеет 72px-изображение, которое будет использоваться напрямую, а Nexus создаст масштабное изображение размером 64 пикселя, так что разница в 8 пикселей между двумя активами.

Что я могу сделать, чтобы сделать два похожих изображения более похожими?

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

Однако, в общем, если есть части вашего пользовательского интерфейса, которые вам нужно специально изменить для этой цели, решение состоит в том, чтобы определить конкретные ресурсы и размеры для случая -tvdpi, где вы считаете, что они требуются (опять же, я бы 't рекомендовать масштабирование ВСЕ в вашем приложении для удовлетворения этого случая).

Для таких вещей, как текст или размеры представления, это означает, что вам может понадобиться файл 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 для ссылки на один актив в двух местах. Для получения дополнительной информации о aliasing, см. Эту документацию. Примеры предназначены для макетов, но одна и та же парадигма работает с чертежами (или любым ресурсом), изменяясь на type="drawable".

Ответ 2

Поскольку Nexus7 является устройством tvdpi, он использует ресурсы layout-sw600dp (на основе вычислений при 213dpi), FireHD является устройством HDPI и заканчивается использованием активов layout-sw533dp (расчеты на основе 240 dpi)

Ответ 3

Возможно, вам следует использовать layout-tvdpi и layout-hdpi?