android-fragments 具有导航组件的幻灯片动画

2g32fytz  于 2022-11-13  发布在  Android
关注(0)|答案(3)|浏览(170)

我正在使用JetPack导航组件在片段之间导航。我在图表xml中的2个片段之间添加了幻灯片动画:

<action
    android:id="@+id/action_Fragment_to_DetailsFragment"
    app:enterAnim="@anim/slide_left"
    app:popEnterAnim="@anim/slide_right"
    app:destination="@id/DetailsFragment" />

问题是- b/c我正在使用导航组件,它使用fragmentManager.replace(),而不是fragmentManager.add(),而不是平滑的动画,我看到:
1.第一个片段消失
1.第二个片段的动画被触发,并将新片段滑动到屏幕
1.第二个片段出现在屏幕上。
和B/c我有不同的内容在两个屏幕上,它看起来有缺陷。我想实现的是“像在IOS中”,用户看到2层屏幕,从对方滑动。有没有办法实现它与导航组件,不支持“fragmentManager.add()“?
我也试过

app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right"

但情况也好不了多少。

xxls0lw8

xxls0lw81#

最后我终于找到了做这件事的方法。
1.在图形中,设置动画:

<action
        android:id="@+id/action_DetailsFragment"
        app:enterAnim="@anim/slide_left"
        app:exitAnim="@anim/wait_anim"
        app:popEnterAnim="@anim/wait_anim"
        app:popExitAnim="@anim/slide_right"
        app:destination="@id/detailsFragment" />

1.创建动画:
slide_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:duration="300"
        android:fromXDelta="100%"
        android:fromYDelta="0%"
        android:toXDelta="0%"
        android:toYDelta="0%" />
</set>

slide_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:duration="300"
        android:fromXDelta="0%"
        android:fromYDelta="0%"
        android:toXDelta="100%"
        android:toYDelta="0%" />
</set>

wait_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300">
</translate>

1.若要使其看起来更好,请在DetailsFragment中添加:
覆盖fun onViewCreated(视图:视图,已保存示例状态:包?){超级.onViewCreated(视图,已保存示例状态)视图兼容性.setTranslationZ(getView()!!,100 f)}
1.您也可以添加sharedElementTransitions以使动画更加独特。

6fe3ivhb

6fe3ivhb2#

如果有人想实现这个动画片段与进入和退出。

<action
    android:id="@+id/action_sign_in_to_fragmentMemberValidate"
    app:destination="@id/fragmentMemberValidate"
    app:enterAnim="@anim/nav_slide_in_right"
    app:exitAnim="@anim/nav_slide_out_left"
    app:popExitAnim="@anim/nav_slide_out_right"
    app:popEnterAnim="@anim/nav_slide_in_left"/>

nav_slide_in_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_shortAnimTime"
        android:fromXDelta="100%"
        android:fromYDelta="0%"
        android:toXDelta="0%"
        android:toYDelta="0%" />
</set>

nav_slide_out_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_shortAnimTime"
        android:fromXDelta="0%"
        android:fromYDelta="0%"
        android:toXDelta="-100%"
        android:toYDelta="0%" />
</set>

nav_slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_shortAnimTime"
        android:fromXDelta="0%"
        android:fromYDelta="0%"
        android:toXDelta="100%"
        android:toYDelta="0%" />
</set>

nav_slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_shortAnimTime"
        android:fromXDelta="-100%"
        android:fromYDelta="0%"
        android:toXDelta="0%"
        android:toYDelta="0%" />
</set>
ar7v8xwq

ar7v8xwq3#

到目前为止,我已经能够使用以下方法改进动画:

  • SharedElement适用于屏幕的某些部分
  • 将alpha添加到动画
  • 提高幻灯片动画的速度,使“空白区域”不那么明显

但仍然无法实现“类似IOS的”幻灯片动画。

相关问题