反转 RTL 布局的进入和退出动画 - Android 导航组件

Reverse enter and exit animation for RTL layout - Android Navigation Component

我正在使用 Android 导航架构组件在片段之间导航。我已经为片段目的地之一设置了进入和退出动画。对于从左到右和从右到左的布局,动画工作正常并且相同。我需要这个动画应该考虑 RTL 布局的相对边缘,即 startend 属性代替 leftright 的作用。实现相同目标的最简单方法是什么?

<fragment
    android:id="@+id/sign_in_fragment"
    android:name="com.example.SignInFragment">

    <action
        android:id="@+id/action_sign_up"
        app:destination="@id/sign_up_fragment"
        app:enterAnim="@anim/slide_in_right"
        app:exitAnim="@anim/slide_out_left"/>

</fragment>

<fragment
    android:id="@+id/sign_up_fragment"
    android:name="com.example.SignUpFragment"/>

anim/slide_out_left

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_shortAnimTime"
        android:fromXDelta="0"
        android:toXDelta="-100%p" />
</set>

anim/slide_in_right

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_shortAnimTime"
        android:fromXDelta="100%p"
        android:toXDelta="0" />
</set>

使用数据绑定你可以做到这一点

<layout>
    <data>
      <variable
            name="isRTL"
            type="Boolean" />
    </data>

    <fragment
        android:id="@+id/sign_in_fragment"
        android:name="com.example.SignInFragment">
    
        <action
            android:id="@+id/action_sign_up"
            app:destination="@id/sign_up_fragment"
            app:enterAnim="@{isRTL ? @anim/slide_in_right : @anim/slide_out_left}"
            app:exitAnim="@{isRTL ? @anim/slide_out_left : @anim/slide_in_right}"/>
    
    </fragment>
</layout>

就像您对不同密度版本的可绘制对象所做的一样,您可以在 anim-ldrtl 中拥有 anim 资源的 RTL 版本,具有相同的 anim 资源名称,但交换行为.

例如slide_out_left.xmlres\anim-ldrtl\中会包含slide_out_right.xml的动画等等。

您可以在 res 下创建 anim-ldrtl 目录,或者您可以为此使用 Android 工作室:

右击res\anim -> 新建 -> 动画资源文件