【发布时间】: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