反转 RTL 布局的进入和退出动画 - Android 导航组件
Reverse enter and exit animation for RTL layout - Android Navigation Component
我正在使用 Android 导航架构组件在片段之间导航。我已经为片段目的地之一设置了进入和退出动画。对于从左到右和从右到左的布局,动画工作正常并且相同。我需要这个动画应该考虑 RTL 布局的相对边缘,即 start
和 end
属性代替 left
和 right
的作用。实现相同目标的最简单方法是什么?
<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.xml
在res\anim-ldrtl\
中会包含slide_out_right.xml
的动画等等。
您可以在 res
下创建 anim-ldrtl
目录,或者您可以为此使用 Android 工作室:
右击res\anim
-> 新建 -> 动画资源文件
我正在使用 Android 导航架构组件在片段之间导航。我已经为片段目的地之一设置了进入和退出动画。对于从左到右和从右到左的布局,动画工作正常并且相同。我需要这个动画应该考虑 RTL 布局的相对边缘,即 start
和 end
属性代替 left
和 right
的作用。实现相同目标的最简单方法是什么?
<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.xml
在res\anim-ldrtl\
中会包含slide_out_right.xml
的动画等等。
您可以在 res
下创建 anim-ldrtl
目录,或者您可以为此使用 Android 工作室:
右击res\anim
-> 新建 -> 动画资源文件