Nexus 7 и Kindle Fire HD, думайте иначе

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

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

Спасибо

3 ответа

Решение

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

  • Nexus 7: TVDPI: масштабный коэффициент = 1,333
  • Kindle Fire HD: HDPI: коэффициент масштабирования = 1,5

Так почему они сообщают по-разному, если они технически имеют одинаковый физический размер и разрешение?

Проблема CORE действительно существует, потому что одно устройство является устройством Google Play (Nexus), а другое - нет (Kindle). Все устройства Android, на которых есть Google Play (и другие приложения Google), могут сделать это только путем прохождения теста под названием Compatibility Test Suite (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 создаст масштабное изображение 64px, поэтому разница между этими двумя ресурсами составляет 8 пикселей.

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

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

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

Для таких вещей, как размеры текста или вида, это означает, что вы можете values-tvdpi/dimensions.xml файл и дефолт values/dimensions.xml файл. Используя приведенный выше пример, вы можете определить размер текста по умолчанию как 16dp, но в -tvdpi местоположение, определите тот же размер, что и 18dp. Это заставит оба устройства масштабировать окончательный текст до 24 пикселей. В вашем коде, где используется фактическое измерение, укажите его как @dimen/myTextSize скорее, чем 16dp непосредственно.

Для рисованных предметов добавьте drawable-tvdpi каталог и масштабировать эти активы, чтобы они соответствовали тому, как вы думаете, они должны рисовать на устройствах, таких как Nexus 7. Снова в нашем предыдущем примере, скопируйте тот же файл изображения из drawable-hdpi папка в drawable-tvdpi папку, чтобы оба устройства рисовали одно и то же изображение с разрешением 72 пикселя.

Чтобы избежать копирования одного и того же ресурса в нескольких местах, вы также можете сделать это с помощью псевдонимов. Помещение самого изображения в drawable/ со специальным именем и используя values-tvdpi/drawables.xml а также values-hdpi/drawables.xml ссылаться на один актив в двух местах. Для получения дополнительной информации о псевдонимах см. Эту документацию. Примеры приведены для макетов, но та же парадигма работает для рисования (или любого ресурса) путем изменения на type="drawable",

Может быть, вы должны использовать layout-tvdpi и layout-hdpi?

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

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