安卓属性动画

2019-11-29  本文已影响0人  笑对浮华

安卓动画主要分3种:\color{#ff0000}{补间动画}\color{#ff0000}{帧动画}\color{#ff0000}{属性动画}

补间动画(Tween Animation,又叫视图动画):

通过对场景里的对象不断做图像变换(透明度、缩放、平移、旋转)从而产生动画效果,是一种渐进式动画,并且View动画支持自定义。

帧动画(Frame Animation):

通过顺序播放一系列图像从而产生动画效果。图片过多时容易造成OOM异常。

属性动画(Accribute Animation ):

这也是在android3.0之后引进的动画,在手机的版本上是android4.0就可以使用>这个动 画,它是通过动态改变对象的属性从而达到动画效果。

补间动画只能作用于view,只是改变了view的视图,但view的真实位置还是在原来的地方。属性动画则不存在这种问题。
下面我们着重介绍属性动画:


属性动画

平移动画代码:

     /**
     * 平移动画
     */
    private void startTranslationAnimation(){
        //创建动画对象  第一个参数是需要执行动画的目标;第二个参数是动画的类型;第三个是动画执行的参数
        ObjectAnimator animator = ObjectAnimator.ofFloat(mTranslateAni,"translationX",400);
        animator.setDuration(1000);//设置动画持续时间
        animator.setInterpolator(new DecelerateInterpolator());//设置插值器  这个设置的是减速插值器
        animator.start();//开始动画
        //动画监听  结束后恢复到原样
        animator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {
                ObjectAnimator animator = ObjectAnimator.ofFloat(mTranslateAni,"translationX",0);
                animator.setDuration(1000);
                animator.setInterpolator(new DecelerateInterpolator());
                animator.start();
            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }
        });
    }

属性动画主要有两个类来实现,ObjectAnimator和ValueAnimator,其中ObjectAnimator继承自ValueAnimator,通过反射实现了动画功能,创建ObjectAnimator对象时传入了两个参数(values),表示动画执行过程中参数的变化,ObjectAnimator就根据这些参数自动完成动画;而使用ValueAnimator时,虽然也给了两个values,但ValueAnimator不会自动执行动画,而是通过 addUpdateListener 方法监听,在时间插值器的作用下,有序的返回一连串数值,然后通过这些数值,对控件进行设置,达到动画的效果。
综合比较,ObjectAnimator的自动化程度更高,性能相比ValueAnimator更高,所以我这就采用的ObjectAnimator。
另外,在平移动画中只实现了X轴单方向的平移,我们也可以实现X轴和Y轴两个方向的同时移动,实现这种效果我知道的代码有两种写法,两种写法都是同时开始动画,没有先后顺序。
一种是建立两个ObjectAnimator对象,一个是X轴,一个是Y轴,两个对象绑定同一个目标控件,除了平移方向其他的属性都设置的一样,代码如下:

        //创建动画对象  第一个参数是需要执行动画的目标;第二个参数是动画的类型;第三个是动画执行的参数
        ObjectAnimator animatorX = ObjectAnimator.ofFloat(mTranslateAni,"translationX",400);
        animatorX.setDuration(1000);//设置动画持续时间
        animatorX.setInterpolator(new DecelerateInterpolator());//设置插值器  这个设置的是减速插值器
        animatorX.start();//开始动画
        ObjectAnimator animatorY = ObjectAnimator.ofFloat(mTranslateAni,"translationY",400);
        animatorY.setDuration(1000);//设置动画持续时间
        animatorY.setInterpolator(new DecelerateInterpolator());//设置插值器  这个设置的是减速插值器
        animatorY.start();//开始动画

上面就是对平移动画的一个简单介绍,其余的缩放动画、旋转动画和透明度动画和上面的平移动画代码差不多,这里贴出来就不一一介绍了。
缩放动画:

    /**
     * 缩放动画
     */
    private void startScaleAnimation(){
        ObjectAnimator animator = ObjectAnimator.ofFloat(mScaleAni,"scaleX",1.0f,0.3f);
        animator.setDuration(1000);
        animator.setInterpolator(new DecelerateInterpolator());
        animator.start();
        animator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {
                ObjectAnimator animator = ObjectAnimator.ofFloat(mScaleAni,"scaleX",0.3f,1.0f);
                animator.setDuration(1000);
                animator.setInterpolator(new DecelerateInterpolator());
                animator.start();
            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }
        });
    }

旋转动画:

    /**
     * 旋转动画
     */
    private void startRotationAnimation(){
        ObjectAnimator animator = ObjectAnimator.ofFloat(mRotationAni,"rotation",360);
        animator.setDuration(1000);
        animator.setInterpolator(new DecelerateInterpolator());
        animator.start();
    }

透明度动画:

    /**
     * 透明度动画
     */
    private void startAlphaAnimation(){
        ObjectAnimator animator = ObjectAnimator.ofFloat(mAlphaAni,"alpha",1f,0.3f);
        animator.setDuration(1000);
        animator.setInterpolator(new DecelerateInterpolator());
        animator.start();
        animator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {
                ObjectAnimator animator = ObjectAnimator.ofFloat(mAlphaAni,"alpha",0.3f,1f);
                animator.setDuration(1000);
                animator.setInterpolator(new DecelerateInterpolator());
                animator.start();
            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }
        });
    }

最后来看一下组合动画,组合动画中有的是同时发生的,有的是有先后顺序的,直接贴出代码:
同时进行:

    /**
     * 组合动画
     */
    private void startCombinationAnimation(){
        PropertyValuesHolder holderTranslationX = PropertyValuesHolder.ofFloat("translationX",0);//X方向平移为0
        PropertyValuesHolder holderTranslationY = PropertyValuesHolder.ofFloat("translationY",0);//Y方向平移为0
        PropertyValuesHolder holderScaleX = PropertyValuesHolder.ofFloat("scaleX",1,0);//X方向缩放
        PropertyValuesHolder holderScaleY = PropertyValuesHolder.ofFloat("scaleY",1,0);//Y方向缩放
        PropertyValuesHolder holderRotation = PropertyValuesHolder.ofFloat("rotation",360);//旋转
        PropertyValuesHolder holderAlpha = PropertyValuesHolder.ofFloat("alpha",1,0);//透明度
        ObjectAnimator.ofPropertyValuesHolder(mCombinationAni,holderTranslationX,holderTranslationY,holderScaleX,holderScaleY,holderRotation,holderAlpha).setDuration(1000).start();
    }

同时进行的动画是创建一批你想要实现的动画效果的PropertyValuesHolder对象,跟创建ObjectAnimator对象差不多,不过不需要绑定目标控件,只需要告诉这个对象想要实现的动画效果类型和参数变化值,创建完成后,将所有的动画效果全部设置到ObjectAnimator对象中去,这样就实现了组合动画。
下面是具有先后顺序动画的代码:

    /**
     * 先后顺序的组合动画
     */
    private void startCombinationOrderAnimation(){
        AnimatorSet set = new AnimatorSet();
        //平移动画
        ObjectAnimator animatorTranslation = ObjectAnimator.ofFloat(mCombinationOrderAni,"translationX",400);
        animatorTranslation.setDuration(1000);
        animatorTranslation.setInterpolator(new DecelerateInterpolator());
        //缩放动画
        ObjectAnimator animatorScale = ObjectAnimator.ofFloat(mCombinationOrderAni,"scaleX",1f,0.3f);
        animatorScale.setDuration(1000);
        animatorScale.setInterpolator(new DecelerateInterpolator());
        //旋转动画
        ObjectAnimator animatorRotation = ObjectAnimator.ofFloat(mCombinationOrderAni,"rotation",360);
        animatorRotation.setDuration(1000);
        animatorRotation.setInterpolator(new DecelerateInterpolator());
        //透明度动画
        ObjectAnimator animatorAlpha = ObjectAnimator.ofFloat(mCombinationOrderAni,"alpha",1f,0.3f);
        animatorAlpha.setDuration(1000);
        animatorAlpha.setInterpolator(new DecelerateInterpolator());
        //设置动画的先后顺序
        set.play(animatorTranslation).before(animatorScale);
        set.play(animatorScale).before(animatorRotation);
        set.play(animatorRotation).before(animatorAlpha);
        set.start();
    }

代码实现就是创建一个AnimatorSet对象,再创建你想要实现的动画ObjectAnimator对象, AnimatorSet对象调用方法play和before,传入ObjectAnimator对象,达到动画的效果。

AnimatorSet中主要通过四个方法来实现顺序:
AnimatorSet.play(Animator anim1).with(Animator anim2)表示两个动画同时进行;
AnimatorSet.play(Animator anim1).after(Animator anim2)表示anim1在anim2之后进行;
AnimatorSet.play(Animator anim1).befor(Animator anim2)表示anim1在anim2之前进行;

除了以上代码能后实现顺序执行动画,也可以通过添加监听的方法实现,还可以设置定时执行动画来达到效果,也可以采用延时的方法实现,总之代码千万种,效果就一种,都可以。

好了,以上就是本人现阶段对属性动画的一个认识,在此记录一下,以后备用。

上一篇下一篇

猜你喜欢

热点阅读