Android开发Android知识移动开发

Android Animation总结

2016-02-05  本文已影响693人  Nickyzhang
Android的动画用得好的话可以产生意想不到的效果,用得不好的话就会使程序产生Crash或者视图加载缓慢

View动画就是通过对场景里面的对象不断地做图像变换(平移、缩放、旋转、透明度)从而产生一种渐进式动画

帧动画是通过顺序播放一系列图像从而产生动画效果,可以简单的理解为图片切换,显然这种方式很容易造成OOM

属性动画是通过动态的改变对象的属性从而达到动画的效果

下面来介绍动画的实现

通过以上的包装类就可以调用get和set方法了,代码如下:

   ViewWrapper wrapper = new ViewWrapper(mButton);
    ObjectAnimator.ofInt(wrapper,"width", 500).setDuration(5000).start();

    
    ObjectAnimator 还给我提供了一系列的监听方法:
    
        ObjectAnimator anim = ObjectAnimator.ofFloat(view, "alpha", 0.5f);
        anim.addListener(new AnimatorListener(){

            @Override
            public void onAnimationStart(Animator animation) {
                //动画开始的操作
            }
            
            @Override
            public void onAnimationEnd(Animator animation) {
                //TODO 动画结束的操作
            }
            
            @Override
            public void onAnimationCancel(Animator animation) {
                //TODO 动画取消的操作
            }
            
            @Override
            public void onAnimationRepeat(Animator animation) {
                //TODO 动画重复的操作
            }

        });
但是大部分时间我们只是关心onAnimatorEnd()事件,所以Android提供了一个AnimatorListenerAdapter来进行必要的监听:
    
        anim.addListener(new AnimatorListenerAdapter(){
            @Override
            public void onAnimatorEnd(Animator animator){
            }
        });

PropertyValuesHolder针对一个对象的多个属性,要同时作用多种动画;

        PropertyValuesHolder pyh1 = PropertyValuesHolder.ofFloat("translationX", 3000);
        PropertyValuesHolder pyh2 = PropertyValuesHolder.ofFloat("translationX", 3000);
        PropertyValuesHolder pyh3 = PropertyValuesHolder.ofFloat("translationX", 3000);

分别用PropertyValuesHolder对象控制tranX,scaleX,scaleY这三个属性,最后调用ObjectAnimator.ofPropertyValuesHolder方法实现多属性动画的共同作用。

ValueAnimation是ObjectAnimation类的父类,ValueAnimator本身不提供任何的动画效果,但他更像一个数值发生器,用来产生一定规律的数字,让调用者来控制动画的实现过程,他的方法如下:

        ValueAnimator animator = ValueAnimator.ofFloat(0, 100);
        animator.setTarget(view);
        animator.setDuration(1000).start();
        animator.addUpdateListener(new AnimatorUpdateListener(){
            @Override
            public void onAnimatorUpdate(ValueAnimator animation){
                Float value = (Float)animation.getAnimatedValue();
            }
        });

对于一个属性同时作用于多个属性动画效果,前面说的可以用PropertyValuesHolder实现,而AnimatorSet同样也可以实现这样的效果,而且顺序控制的更为精准,代码如下:

        ObjectAnimator animator1 = ObjectAnimator.ofFolat(view, "translationX", 300f);
        ObjectAnimator animator2 = ObjectAnimator.ofFolat(view, "scaleX", 1f, 0f, 1f);
        ObjectAnimator animator3 = ObjectAnimator.ofFolat(view, "scaleY", 1f, 0f, 1f);
        AnimatorSet set = new AnimatorSet();
        set.setDuration(1000);
        set.playTogether(animator1, animator2, animator3);
        set.start();

AnimatorSet通过playTogether(),playSequentially(),animSet.play(),with(),before(),after()这些方法来控制多个动画的协同工作方式,从而做到对动画播放顺序的精确控制。

在程序中使用XML中定义的属性动画

        public void scaleX(View view){
            Animator anim = AnimatorInflater.loadAnimator(this, R.animator.scalex);
            anim.setTarget(view);
            anim.start();
        }

我们看一下插值器的定义:插值器定义了动画变化的速率,提供不同的函数定义变化值相对于时间的变化规则,可以定义各种各样的非线性变化函数,比如加速、减速。他就是一个可以让我们的动画速度变化的值。

上一篇 下一篇

猜你喜欢

热点阅读