Nexus 7 и Kindle Fire HD: мыслите по-разному

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

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

Спасибо


person Pauland    schedule 31.10.2012    source источник
comment
Интересно, можете ли вы предоставить нам SS, который показывает различия (я знаю, что это может быть сложно, поскольку вы разрабатываете проект)?   -  person Warpzit    schedule 31.10.2012
comment
Отображает ли Nexus7 приложение в соответствии с вашими макетами по умолчанию? Эд Бернетт рассказал о проблеме, связанной с разрешением TVDPI, особенно Nexus7. Я предполагаю, что вместо этого Nexus получает макет по умолчанию.   -  person Sergi Juanola    schedule 31.10.2012
comment
Нам нужно знать, что именно выглядит иначе, чтобы помочь вам.   -  person Security Hound    schedule 31.10.2012
comment
Макеты находятся в layout-sw530dp. Результат: docs.google.com/open?id=0B8242osqx3OrUXhlbENRTXhOcWM   -  person Pauland    schedule 31.10.2012
comment
Nexus7 на самом деле использует layout-sw600dp, но Kindle Fire HD 7 не использует, и я не знаю, какой из них использует.   -  person StErMi    schedule 31.10.2012
comment
я знаю, что Nexus 7 использует sw600p, но нет никакой разницы в использовании sw530   -  person Pauland    schedule 31.10.2012


Ответы (3)


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

  • 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
comment
Это отличный ответ, одно предостережение, которое я добавлю, заключается в том, что псевдонимы на основе плотности являются лишь временным исправлением. Когда выйдет планшет, соответствующий CDD и действительно HDPI, все вышеперечисленное сломается. Это та же самая ситуация, в которой мы были с Galaxy Tab 7. Он сообщал как HDPI, хотя на самом деле это был MDPI. Все использовали псевдонимы, чтобы заставить его работать, но когда вышел Nexus 7, все хаки были раскрыты, и большинству компаний пришлось отказаться от поддержки Tab 7, чтобы поддерживать новую линейку устройств с более высоким разрешением. В настоящее время я склоняюсь к новым макетам, использующим -sw533dp, но я все еще недоволен. - person JustinMorris; 30.11.2012

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

person Offbeatmammal    schedule 16.11.2012
comment
Зачем? плотность рассчитывается в пикселях/дюйм. оба устройства имеют одинаковое разрешение, оба устройства имеют одинаковый размер дисплея. а почему такая разница в плотности? - person stoefln; 24.11.2012

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

person jumper0k    schedule 28.11.2012