API 19以下版本的矢量图可实现RTL支持

12

我有一个向量可绘制对象。

<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。 我该如何添加向后兼容性? 任何帮助都将不胜感激。

2个回答

15

以下是我会如何做,而不使用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属性,改为在一个点为12(即可绘制对象的中间位置),并将scaleX指向一个Dimen资源的<group>标签中包装矢量路径。

在普通values文件夹中,您应该提供资源如下:

<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时,只需将它们包装在组标记中,如上所示,指向相同的dimen即可。


我遇到了一个错误 错误: 错误: 对于输入的字符串 "@dimen/layout_direction_aware_scale" - amorenew
1
@amorenew,我不确定那个错误,但是你的评论让我再次阅读了这篇帖子并发现了一个问题。我在dimen资源中使用了两个不同的名称,现在已经进行了更正! - Lewis McGeary
1
你在<group/>...</group>中多打了一个“/”。 - Daniel
需要添加 pivotX 属性吗? - Abdulmalek Dery
1
@AbdulmalekDery 我会这么说。否则,pivotX将默认为零,结果是图像将围绕左侧旋转而不是中心旋转。我认为在许多情况下,这意味着它根本看不见,因为它已经超出了可绘制视口的左侧,但如果仍然可以看到它,则位置也会发生变化,而不仅仅是在原始位置翻转图像。 - Lewis McGeary
1
很遗憾它无法正常工作 - 我得到了这个异常 java.lang.NumberFormatException:对于输入字符串:“@dimen / rtl_automirror_scale” - BWappsAndmore

3
在我的ImageView中,我添加了:
android:scaleX="@integer/local_mirror_scale_x"

然后在values文件夹下的integers.xml中

英文中的integers

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

在阿拉伯数字中
<integer name="local_mirror_scale_x">-1</integer>

1
嗨@amorenew,我尝试了这个,但是出现了错误“Error: Error: For input string: "@integer/local_mirror_scale_x",我不知道为什么。 - ahmed Shoeib
@ahmedShoeib 尝试清理并构建,可能您的项目无法识别该 ID 的链接。 - amorenew
清理和构建后问题仍然存在。 - ahmed Shoeib
我不确定,但可以在另一个项目中尝试相同的解决方案,可能是拼写错误或其他原因。 - amorenew
如果是TextView而不是ImageView会怎样? - Hamzeh Soboh
对于TextView,您必须通过代码而不是XML或在drawable-ar文件夹中使用PNG来创建它。 - amorenew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接