ApiDemos—FragmentCustomAnimations分析

这个例子主要向我们介绍如何在添加和移除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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值