Как указать 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.

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