【问题标题】:Animating Fragment causes other view to "jump"动画片段导致其他视图“跳跃”
【发布时间】:2016-07-06 09:55:15
【问题描述】:

小问题:

在 FragmentTransactions 上使用动画时,如何使用动画为其他视图设置动画?

长问题:

嗨,

我是片段等的新手,我试图在一个活动中为它们设置动画,因此我为该活动创建了以下 xml 文件:

<LinearLayout
    android:id="@+id/run_select_fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true"
    android:orientation="vertical">


    <FrameLayout
        android:id="@+id/activity_run_search_fragmentHeaderPlaceholder"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <FrameLayout
        android:id="@+id/activity_run_search_fragmentPlaceholder"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

</LinearLayout>

然后我定义了要用于动画的 res/anim 文件:

fade_in_from_top.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">

    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
        android:duration="@android:integer/config_longAnimTime" />

    <translate
        android:fromXDelta="0%" android:toXDelta="0%"
        android:fromYDelta="-100%" android:toYDelta="0%"
        android:duration="1000" />
</set>

fade_in_from_bottom.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">

    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
        android:duration="@android:integer/config_longAnimTime" />

    <translate
        android:fromXDelta="0%" android:toXDelta="0%"
        android:fromYDelta="100%" android:toYDelta="0%"
        android:duration="1000"/>
</set>

fade_out_to_bottom.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <alpha
        android:duration="@android:integer/config_longAnimTime"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />

    <translate
        android:duration="700"
        android:fromXDelta="0%"
        android:fromYDelta="0%"
        android:toXDelta="0%"
        android:toYDelta="100%" />
</set>

fade_out_to_top.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">

    <alpha
        android:duration="@android:integer/config_longAnimTime"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />

    <translate
        android:duration="700"
        android:fromXDelta="0%"
        android:fromYDelta="0%"
        android:toXDelta="0%"
        android:toYDelta="-100%" />
</set>

详细说明: 下面的片段总是包含一个带有多个项目的列表视图。我确实根据通过切换按钮搜索的内容来更改片段。那没问题。当用户点击特定的列表条目时,headerFragment 将填充额外的数据并显示为淡入动画,如:

加载数据时先显示加载片段:

final RSBaseFragment headerFragment = (RSBaseFragment) getSupportFragmentManager().findFragmentById(R.id.activity_run_search_fragmentHeaderPlaceholder);

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
LoadingFragment fragment = new LoadingFragment();

if (headerFragment != null) {
    ft.setCustomAnimations(R.anim.fade_in_from_bottom, R.anim.fade_out_to_top, R.anim.fade_in_from_top, R.anim.fade_out_to_bottom);
    ft.replace(R.id.activity_run_search_fragmentHeaderPlaceholder, fragment, HEADER_FRAGMENT_TAG);
} else {
    ft.setCustomAnimations(R.anim.fade_in_from_top, R.anim.fade_out_to_bottom, R.anim.fade_in_from_bottom, R.anim.fade_out_to_top);
    ft.add(R.id.activity_run_search_fragmentHeaderPlaceholder, fragment, HEADER_FRAGMENT_TAG);
}
ft.commit();

加载数据后,在新片段中显示数据,替换加载片段

HeaderFragment fragment = new HeaderFragment();
ft.setCustomAnimations(R.anim.fade_in_from_top, R.anim.fade_out_to_bottom, R.anim.fade_in_from_bottom, R.anim.fade_out_to_top);
ft.replace(R.id.activity_run_search_fragmentHeaderPlaceholder, fragment, HEADER_FRAGMENT_TAG);

问题在于 headerfragment 正在淡入淡出并从顶部或底部方向滑入,而持有 listview 的片段甚至在它出现之前“跳跃”到 headerfragment 的底部 Y。如何使下部片段与标题片段一起滑动以创建流畅的用户体验?

抱歉,问题太长了。如果搜索了 3 天,但没有发现任何有助于解决我的问题的东西。

【问题讨论】:

    标签: android android-fragments animation transition


    【解决方案1】:

    我通过添加到 LinearLayout (run_select_fragment_container) 几乎解决了它

    android:animateLayoutChanges="true"
    

    在 Activity 的 onCreate 中我已经这样做了

    LinearLayout mainLayout = (LinearLayout) findViewById(R.id.run_select_fragment_container);
    LayoutTransition layoutTransition = mainLayout.getLayoutTransition();
    layoutTransition.enableTransitionType(LayoutTransition.CHANGING);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      相关资源
      最近更新 更多