Android碎片和animation
您应该如何实现例如Honeycomb Gmail客户端使用的那种滑动?
可以通过添加和删除碎片自动处理这个事情,这是很难testing这是由于模拟器是一个幻灯片:)
要为片段之间的转换设置animation效果,或者要animation显示或隐藏片段的过程,请使用Fragment Manager
创buildFragment Transaction
。
在每个片段事务中,您可以分别指定将用于显示和隐藏的animation(或两者都使用replace)。
下面的代码显示了如何通过滑出一个片段并将另一个片段滑入其中来replace片段。
FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right); DetailsFragment newFragment = DetailsFragment.newInstance(); ft.replace(R.id.details_fragment_container, newFragment, "detailFragment"); // Start the animated transition. ft.commit();
要隐藏或显示片段,只需调用ft.show
或ft.hide
,分别传递要显示或隐藏的片段即可。
作为参考,XMLanimation定义将使用objectAnimator
标记。 slide_in_left的一个例子可能如下所示:
<?xml version="1.0" encoding="utf-8"?> <set> <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:propertyName="x" android:valueType="floatType" android:valueFrom="-1280" android:valueTo="0" android:duration="500"/> </set>
如果你不需要使用支持库,那么看看Roman的答案。
但是如果你想使用支持库,你必须使用旧的animation框架,如下所述。
在咨询雷托和盲目的答案后,我得到了下面的代码工作。
碎片从右侧 滑入,并在按下后退时滑出 。
FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit); CustomFragment newCustomFragment = CustomFragment.newInstance(); transaction.replace(R.id.fragment_container, newCustomFragment ); transaction.addToBackStack(null); transaction.commit();
顺序很重要。 这意味着你必须在replace()
setCustomAnimations()
之前调用setCustomAnimations()
replace()
或者animation不会生效!
接下来,这些文件必须放置在res / anim文件夹中。
enter.xml :
<?xml version="1.0" encoding="utf-8"?> <set> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="100%" android:toXDelta="0" android:interpolator="@android:anim/decelerate_interpolator" android:duration="@android:integer/config_mediumAnimTime"/> </set>
exit.xml :
<set> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="0" android:toXDelta="-100%" android:interpolator="@android:anim/accelerate_interpolator" android:duration="@android:integer/config_mediumAnimTime"/> </set>
pop_enter.xml :
<set> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="-100%" android:toXDelta="0" android:interpolator="@android:anim/decelerate_interpolator" android:duration="@android:integer/config_mediumAnimTime"/> </set>
pop_exit.xml :
<?xml version="1.0" encoding="utf-8"?> <set> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="0" android:toXDelta="100%" android:interpolator="@android:anim/accelerate_interpolator" android:duration="@android:integer/config_mediumAnimTime"/> </set>
animation的持续时间可以更改为任何默认值,如@android:integer/config_shortAnimTime
或任何其他数字。
请注意,如果在碎片replace之间发生configuration更改(例如旋转),则后退操作不会生成animation。 这是在支持库的第20版中仍然存在的logging的错误 。
我修改过的支持库支持同时使用Viewanimation(即<translate>, <rotate>
)和Object Animators(即<objectAnimator>
)进行片段转换。 它与NineOldAndroids实施。 有关详细信息,请参阅我在github上的文档。
请试试这个。 Android Studio提供默认animation
。
fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left,android.R.anim.slide_out_right);
FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right); fragmentManager.addOnBackStackChangedListener(this); fragmentTransaction.replace(R.id.frame, firstFragment, "h"); fragmentTransaction.addToBackStack("h"); fragmentTransaction.commit();
输出:
我在下面解决这个问题
Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide); fg.startAnimation(anim); this.fg.setVisibility(View.VISIBLE); //fg is a View object indicate fragment