这个例子主要向我们介绍如何在添加和移除Fragment时指定动画。关于如何指定动画,我们先来看看Push按钮的处理事件:
void addFragmentToStack() {
mStackLevel++;
// Instantiate a new fragment.
Fragment newFragment =CountingFragment.newInstance(mStackLevel);
// Add the fragment to the activity, pushing this transaction
// on to the back stack.
FragmentTransaction ft =getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.animator.fragment_slide_left_enter,
R.animator.fragment_slide_left_exit,
R.animator.fragment_slide_right_enter,
R.animator.fragment_slide_right_exit);
ft.replace(R.id.simple_fragment, newFragment);
/*一定调用下面这句话,把当前事务操作放入栈中*/
ft.addToBackStack(null);
ft.commit();
}
点击Push按钮,就会向界面中添加一个新的Fragment,这个Fragment的内容很简单,就是显示一个文本,内容为”Fragment #数字”,其中数字从1递增。从上面我们就可以知道原来指定Fragment的动画用很简单的一句话就可以了:
FragmentTransaction android.app.FragmentTransaction.setCustomAnimations(intenter, int exit, int popEnter, int popExit)
其中参数的意义是
1)enter 指定向栈中放入新的Fragment时的动画
2)exit 指定向栈中弹出当前栈顶的Fragment时的动画
3)popEnter 指定由于当前栈顶Fragment弹出而显示底层的Fragment时的动画
4)popExit 指定当前栈顶的Fragment被弹出时的动画
这4个参数必须是/xml/animator下的某个animator资源动画文件,我们选取enter时的动画文件来讲解吧:
/res/animator/fragment_slide_left_enter.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:interpolator="@android:interpolator/decelerate_quint"
android:valueFrom="100dp"android:valueTo="0dp"
android:valueType="floatType"
android:propertyName="translationX"
android:duration="@android:integer/config_mediumAnimTime"/>
<objectAnimator
android:interpolator="@android:interpolator/decelerate_quint"
android:valueFrom="0.0"android:valueTo="1.0"
android:valueType="floatType"
android:propertyName="alpha"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>
动画文件内容使用了一个AnimatorSet来组合了两个ObjectAnimator对象,由于<set>没有指定其它属性,那么它会同时播放那两个ObjectAnimator。
第1个ObjectAnimator指定目标对象的translationX位置从100dp移至0dp,那么其实动画效果看起来就像目标从右边向左边滑动一样。
第2个ObjectAnimator指定目标对象的alpha属性从0.0到1.0,即透明度从完全透明到不透明。
运行实例,大家是可以明显看到效果的。上面比较有意思的是指定了android:interpolator,之前我们已经讲过了interpolator,如果你第一次看到decelerate_quint,那么不用担心,其实他的内容如下:
sdk\platforms\android-19\data\res\interpolator\accelerate_quint.xml
<accelerateInterpolatorxmlns:android="http://schemas.android.com/apk/res/android"
android:factor="2.5" />
原来它本质上是一个accelerateInterpolator,不过指定系数为2.5,这个系数会加大动画时的加速度。那个文件所在的目录下还有其它interpolator文件,这样你可以大致浏览一下。通过这个例子,你可以知道如何在XML文件中指定interpolator了。
在本例中,奇怪的是没有指定Pop按钮的点击事件,我把点击事件添加了上去:
Button deleteFragment = (Button)findViewById(R.id.delete_fragment);
deleteFragment.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
FragmentManager fragMgr =getFragmentManager();
if (fragMgr.getBackStackEntryCount() != 0) {
getFragmentManager().popBackStack();
mStackLevel--;
} else {
Toast.makeText(FragmentCustomAnimations.this, "当前栈已空", Toast.LENGTH_SHORT).show();
}
}
});
<a target=_blank href="http://m.blog.csdn.net/blog/zhangyingli/39693195">原文地址点击打开链接</a>