Поддержка RTL для векторного рисования ниже API 19

У меня есть vector drawable.

<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:autoMirrored="true"
android:viewportHeight="24.0"
android:viewportWidth="24.0">
    <path
        android:fillColor="#65666a"
        android:pathData="M8.59,16.34l4.58,-4.59 -4.58,-4.59L10,5.75l6,6 -6,6z" />
</vector>

Я добавил атрибут android:autoMirrored="true" для поддержки RTL, но он используется только в API 19 и выше. Но мой минимальный уровень API — API 17. Как я могу добавить обратную сопоставимость? Любая помощь будет оценена по достоинству.


person Alex Chengalan    schedule 23.10.2016    source источник


Ответы (2)


Вот как я бы это сделал, вместо использования autoMirrored используйте этот обходной путь, чтобы сделать собственное «автозеркало».

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportHeight="24.0"
    android:viewportWidth="24.0">
    <group
        android:pivotX="12"
        android:scaleX="@dimen/rtl_automirror_scale">
        <path
            android:fillColor="#65666a"
            android:pathData="M8.59,16.34l4.58,-4.59 -4.58,-4.59L10,5.75l6,6 -6,6z" />
    </group>
</vector>

Здесь я удалил атрибут autoMirror и вместо этого обернул векторный путь тегом <group> с точкой pivotX, равной 12 (т. е. середина рисуемого объекта), и scaleX, указывающим на ресурс Dimen.

В папке с нормальными значениями вы должны указать ресурс как:

<resources>

    <item name="rtl_automirror_scale" format="float" type="dimen">1</item>

</resources>

Значение 1 для масштаба означает отсутствие изменений, только нормальное рисование.

Однако затем вы можете предоставить ресурс альтернативных значений для RTL устройств в values-ldrtl:

<resources>

    <item name="rtl_automirror_scale" format="float" type="dimen">-1</item>

</resources>

Значение -1 означает, что VectorDrawable будет перевернуто по горизонтали для RTL устройств.

Затем, когда у вас есть другие VectorDrawables, которые нужно перевернуть, просто оберните их групповым тегом, как указано выше, указав на тот же размер.

person Lewis McGeary    schedule 23.10.2016
comment
я получил ошибку Ошибка: Ошибка: для входной строки: @dimen/layout_direction_aware_scale - person amorenew; 25.01.2017
comment
@amorenew, я не уверен насчет этой ошибки, но ваш комментарий заставил меня снова прочитать этот пост и увидеть проблему. Я использовал два разных имени для ресурса dimen, поэтому исправил это! - person Lewis McGeary; 25.01.2017
comment
Вы положили еще один / в <group/>...</group> по ошибке - person Daniel; 25.02.2018
comment
нужно ли добавлять атрибут pivotX? - person Abdulmalek Dery; 14.08.2019
comment
@AbdulmalekDery Я бы так сказал. В противном случае pivotX по умолчанию будет равен нулю, и в результате изображение будет вращаться вокруг левой стороны, а не вокруг центра. Я думаю, что во многих случаях это означает, что он вообще не будет виден, поскольку он вышел за пределы левой стороны окна просмотра drawable, но если его все еще можно увидеть, то он также сместил бы положение, а не просто перевернул изображение в его первоначальное местонахождение. - person Lewis McGeary; 15.08.2019
comment
К сожалению, это не работает - я получаю это исключение java.lang.NumberFormatException: For input string: "@dimen/rtl_automirror_scale" - person BWappsandmore; 31.03.2020

в моем изображении я добавил

android:scaleX="@integer/local_mirror_scale_x"

затем в integers.xml в значениях

в английских целых числах

<integer name="local_mirror_scale_x">1</integer>

в арабских целых числах

<integer name="local_mirror_scale_x">-1</integer>
person amorenew    schedule 08.02.2017
comment
Привет, @amorenew, я попробовал это, но получил ошибку Ошибка: Ошибка: для входной строки: @integer/local_mirror_scale_x, я не знаю, почему - person ahmed Shoeib; 14.08.2017
comment
@ahmedShoeib попробуйте очистить и построить, возможно, ваш проект не распознает ссылку на этот идентификатор - person amorenew; 14.08.2017
comment
все еще проблема существует после очистки и сборки - person ahmed Shoeib; 14.08.2017
comment
Я не уверен, но попробуйте то же решение в отдельном проекте, может быть ошибка опечатки или что-то еще - person amorenew; 14.08.2017
comment
Что, если бы вместо ImageView было TextView - person Hamzeh Soboh; 04.09.2017
comment
для TextView вы должны сделать это по коду, а не по xml или использовать png в папке drawable-ar - person amorenew; 04.09.2017