Может кто-нибудь объяснить, как работают квалификаторы Android?

Я действительно запутался в квалификаторах Android.

Я хочу создать индивидуальный дизайн для RatingBar. Поэтому я создал файл rating_bar.xml и поместил его в папку drawable. Вот источник:

<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background" android:drawable="@drawable/star_off"/>
    <item android:id="@android:id/secondaryProgress" android:drawable="@drawable/star_on"/>
    <item android:id="@android:id/progress" android:drawable="@drawable/star_on"/>
</layer-list>

У меня звездный дизайн только для дисплеев xhdpi. Я подумал, что если я помещу изображения star_on и star_off в папку drawable-xhdpi, все будет автоматически изменено для всех различных плотностей (mdpi и hdpi). Да, он изменил размер, но у меня есть некоторые артефакты для hdpi и mdpi. То же, что и здесь: Артефакты пользовательского изображения RatingBar для Android Я попробовал решения, которые были описаны там, но мне ничего не помогло. На устройствах xhdpi у меня нет артефактов, а на устройствах mdpi и hdpi артефакты есть.

Затем я решил поместить изображения star_on и star_off в папку drawable-nodpi. Таким образом, я получил хороший результат без каких-либо артефактов для экранов xhdpi и hdpi, но для экранов mdpi изображения были слишком большими.

Затем я решил скопировать изображения star_on и star_off в папку drawable-mdpi и уменьшить размер изображений. Тоже не помогло.

Затем я помещаю большие изображения звезд в папки xhdpi и hdpi, а маленькие изображения звезд - в папку mdpi. Я думал, что если я запущу свое приложение на mdpi, будут выбраны изображения устройств из drawable-mdpi. Но похоже, что Android выбирает изображения из hdpi или из папки xhdpi и автоматически масштабирует их для экрана mdpi, потому что у меня снова есть артефакты. Я также попытался поместить небольшие изображения в папку с возможностью рисования. Тоже не помогло.

Итак, как Android выбирает ресурсы? Я подумал, что если у меня есть ресурсы в drawable, drawable-mdpi, drawable-hdpi и drawable-xhdpi, то Android попытается найти ресурс в папке с той же плотностью, что и на устройстве. А если такого ресурса нет, то он берется из папки drawable.


person Dmitriy    schedule 23.02.2013    source источник


Ответы (2)


эта часть руководства для разработчиков объясняет, что именно вам нужно, я думаю . Это демонстрируется на примере:

Чтобы продемонстрировать, как Android выбирает альтернативный ресурс, предположим, что следующие доступные для рисования каталоги содержат разные версии одних и тех же изображений:

drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/

И предположим, что конфигурация устройства следующая:

Locale = en-GB 
Screen orientation = port 
Screen pixel density = hdpi 
Touchscreen type = notouch 
Primary text input method = 12key

Сравнивая конфигурацию устройства с доступными альтернативными ресурсами, Android выбирает чертежи из

drawable-en-port

Существует также диаграмма выбора, описывающая, как Android выбирает квалификаторы.

person IronBlossom    schedule 30.05.2013

Android выбирает ресурсы из доступных папок в соответствии с dpi

есть четыре плотности экрана

  1. лдпи
  2. mdpi
  3. hdpi
  4. xhdpi

четыре размера экрана

layout-small
layout-nomal
layout-large
layout-xlarge

маленький размер экрана = 2,2–2,7 дюйма (приблизительно)

нормальный размер экрана = 3,0–4,7 дюйма (приблизительно)

большой размер экрана = 5–7 дюймов (приблизительно)

xбольшой размер экрана = 7 дюймов> (приблизительно)

ldpi = 120 точек на дюйм

mdpi = 160 dpi

HDPI 240dpi

xhdpi = 320 точек на дюйм

создайте свой avd в соответствии с этими плотностями и размерами экрана, затем проверьте результат

person Mudassar Shaheen    schedule 23.02.2013