Как указать RTL-специфичные отрисовки
У меня есть несколько изображений, которые выглядят по-разному справа налево. Можно ли создать специфичный для RTL каталог для рисования или какой-нибудь пост-исправление для имен файлов для автоматической загрузки соответствующих изображений? Похоже, что пост-исправление ldrtl, добавленное с 17 уровня, хорошо только для каталога раскладок.
3 ответа
Уже довольно поздно отвечать на этот вопрос, но я хочу поделиться методом, который я только что узнал. Я сначала напомню, что упоминается другими.
Давайте начнем со спецификации.
Нам нужно построить что-то вроде:
login --> take picture --> win prize
В RTL это станет:
ezirp niw <-- erutcip ekat <-- nigol
Итак, большой вопрос в том, как мы перевернем нарисованную стрелку, назовем ее arrow_right.png
:
-->
и в RTL вы хотите, чтобы это было так:
<--
Для Android >=19
Как уже упоминалось, мы можем использовать autoMirrored=true
флаг. (доступно из API19)
Использование:
<ImageView ...
src="@drawable/arrow_right"
autoMirrored="true" />
Активы:
├── drawable-xxxhdpi
└── arrow_right.png
├── drawable-xxhdpi
└── arrow_right.png
├── drawable-xhdpi
└── arrow_right.png
├── drawable-hdpi
└── arrow_right.png
├── drawable-mdpi
└── arrow_right.png
Обратите внимание, что:
arrow_right.png
внутриdrawable-*
содержать-->
Примечания: Единственным недостатком является то, что он не имеет обратной совместимости.
Для Android <19, вариант 1
Как и другие, вы можете использовать ldrtl
вариант. (документ: Предоставление ресурсов)
Использование:
<ImageView ...
src="@drawable/arrow_right" />
Активы:
├── drawable-xxxhdpi
└── arrow_right.png
├── drawable-xxhdpi
└── arrow_right.png
├── drawable-xhdpi
└── arrow_right.png
├── drawable-hdpi
└── arrow_right.png
├── drawable-mdpi
└── arrow_right.png
├── drawable-ldrtl-xxxhdpi
└── arrow_right.png
├── drawable-ldrtl-xxhdpi
└── arrow_right.png
├── drawable-ldrtl-xhdpi
└── arrow_right.png
├── drawable-ldrtl-hdpi
└── arrow_right.png
├── drawable-ldrtl-mdpi
└── arrow_right.png
Обратите внимание, что:
arrow_right.png
внутриdrawable-*
содержать-->
arrow_right.png
внутриdrawable-ldrtl-*
содержать<--
,
Замечания: в этом методе нет ничего плохого, за исключением того, что вам нужно подготовить как файлы ресурсов 10x. Так что это заставляет меня выяснить следующий вариант.
Для Android <19, вариант 2
Эта опция будет использовать rotationY="180"
атрибутов. (доступно из API11)
Если вы установите rotationY="180"
в ImageView
, -->
превратится в <--
,
Таким образом, мы можем сделать что-то вроде следующего.
Использование:
<ImageView ...
src="@drawable/arrow_right"
android:rotationY="@integer/angle_rtl_180" />
Активы:
drawable
├── drawable-xxxhdpi
└── arrow_right.png
├── drawable-xxhdpi
└── arrow_right.png
├── drawable-xhdpi
└── arrow_right.png
├── drawable-hdpi
└── arrow_right.png
├── drawable-mdpi
└── arrow_right.png
├── values
└── integers.xml
├── values-ldrtl
└── integers.xml
Замечания:
arrow_right.png
содержит-->
values/integers
содержит<integer name="angle_rtl_180">0</integer>
values-ldrtl/integers
содержит<integer name="angle_rtl_180">180</integer>
Примечания: Вам нужен только 1 набор ресурсов, и это решение можно использовать из API 11, а использование достаточно просто, просто добавив android:rotationY="@integer/angle_rtl_180"
,
Надеюсь, поможет!
Для 17+ (4.2.x+) вы можете использовать спецификатор ресурсов направления расположения (ld), для справа налево (RTL) вы можете использовать ldrtl, а для слева направо (LTR) вы можете использовать ldltr, например, вы можете использовать
res/
drawable // Default
drawable-ldltr // LTR
drawable-ldrtl // RTL
Также, как и любой другой классификатор, вы можете комбинировать его со многими другими, например, drawable-ldrtl-xhdpi
Обратите внимание, как ldrtl появляется до xhdpi, иначе aapt будет жаловаться.
И как @Dennis упоминается с 19+ (4.4+), это становится проще, так как вы можете использовать autoMirrored
Есть возможность автоматически отразить отрисовку. Проверьте атрибут autoMirrored.