Animator的基本用法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaozhiwen6140/article/details/52026871

这里仅仅介绍Animator的一些基本的用法:

说到Animator,最重要的最常用的的就是ObjectAnimator类,因为这个类可以对任意View的任意属性进行操作。

首先以ImageView为例,以下所有的操作都针对ImageView:

1.只展示一种动画效果(只改变控件对象的一个属性),代码如下:

ObjectAnimator animator=ObjectAnimator.ofFloat(imageView,"alpha",0F,1F);
animator.setDuration(6000);
animator.start();
首先说一下ObjectAnimatorofFloat()方法,ObjectAnimator还有ofInt(),ofObject()等方法,作用基本相
同,都是对相应的View进行动画操作,ofFloat()一般更常用,因为变化值能更加精确。参数有三个,第一个参数是
作用的view,第二个参数是属性,第三个参数是一个长度可变的数组,用于存储属性的变化范围。其中属性包括alpha
(透明度),rotation(旋转角度),translationX(位置横坐标变化),translationY(位置纵坐标变化),scaleX
(水平尺寸变化),scaleY(垂直尺寸变化)等。只要是View能够通过get或者set方法进行修改的属性都可以做为第
二个参数。第三个参数可以不限制个数的添加,比如透明度变化,如果从0F到1F再到0F,就说明由完全透明变成完全
不透明再变成完全透明。表示为ObjectAnimator animator=ObjectAnimator.ofFloat(imageView,"alpha",0F,1F,0F);
 
 
setDuration()是设置该动画的持续时间,start()表示启动动画。上面三句也可以直接写成
 
 
ObjectAnimator.ofFloat(imageView,"alpha",0F,1F).setDuration(6000).start();
2.同时展示多种动画效果(多个属性同时发生法改变),调用start()方法之后,实际上执行的是一个异步的过程。
因此,所有的效果会一起执行。这是一个View对象的多个动画同时执行。
ObjectAnimator.ofFloat(imageView,"rotation",0F,360F).setDuration(3000).start();
ObjectAnimator.ofFloat(imageView,"translationX",0F,200F).setDuration(3000).start();
ObjectAnimator.ofFloat(imageView,"translationY",0F,200F).setDuration(3000).start();
以上动画表示ImageView在这3秒内旋转360度的同时位移也发生变化。
3.对于不同的对象也可以进行多个动画并行执行。
ObjectAnimator.ofFloat(imageView1,"rotation",0F,360F).setDuration(3000).start();
ObjectAnimator.ofFloat(imageView2,"translationX",0F,200F).setDuration(3000).start();
ObjectAnimator.ofFloat(imageView2,"translationY",0F,200F).setDuration(3000).start();
以上动画表示ImageView1旋转360度跟ImageView2位移发生变化同时执行。
4.优化ObjectAnimator的用法,能达到同样的效果, 但是 体验更好(可以不用重复调用setDuration()以及start()方法)。
PropertyValuesHolder p1=PropertyValuesHolder.ofFloat("rotation",0F,360F);
PropertyValuesHolder p2=PropertyValuesHolder.ofFloat("translationX",0F,200F);
PropertyValuesHolder p3=PropertyValuesHolder.ofFloat("translationY",0F,200F);
ObjectAnimator.ofPropertyValuesHolder(imageView,p1,p2,p3).setDuration(3000).start();
ObjectAnimator的ofPropertyValuesHolder()方法的三个参数分别是动画作用的View,以及动画的效果。
注意:这个方法只能针对同一个对象进行动画。
5.使用AnimationSet实现多属性展示动画的效果(把所有的Animation对象都塞入到AnimatorSet中),用于将所有
动画放在集合中,也可以调整动画的播放顺序。
 
 
AnimatorSet set=new AnimatorSet();
ObjectAnimator animator1=ObjectAnimator.ofFloat(imageView,"rotation",0F,360F);
ObjectAnimator animator2=ObjectAnimator.ofFloat(imageView,"translationX",0F,200F);
ObjectAnimator animator3=ObjectAnimator.ofFloat(imageView,"translationY",0F,200F);
set.playTogether(animator1,animator2,animator3);//动画1,2,3同时执行
set.playSequentially(animator1,animator2);//动画按照顺序执行,先执行1,再执行2
 
 
set.play(animator2).with(animator3);//表示2和3同时执行
set.play(animator1).after(animator2);//表示1在2之后执行(即2和3同时执行完成之后,再执行1)
set.play(animator1).before(animator2);//表示1在2之前执行
set.setDuration(3000);set.start();
其中,playSequentially()以及play()以及playTogether()可以同时也可以分开使用。
6.动画监听事件:
ObjectAnimator animator=ObjectAnimator.ofFloat(imageView,"alpha",0F,1F);
animator.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        super.onAnimationEnd(animation);
        Toast.makeText(MainActivity.this, "动画结束", Toast.LENGTH_SHORT).show();
    }
});
animator.setDuration(6000);
animator.start();
使用AnimatorListenerAdapter()这个监听器,可以只重写一个方法,一般只重写常用的end()方法,
表示在动画结束之后,弹出Toast。
假如使用Animator.AnimatorListener()监听器,则必须需要重写以下这四个方法:
ObjectAnimator animator=ObjectAnimator.ofFloat(imageView,"alpha",0F,1F);
animator.addListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animation) {
        //动画开始之前的处理
    }

    @Override
    public void onAnimationEnd(Animator animation) {
        //动画结束之后的处理
    }

    @Override
    public void onAnimationCancel(Animator animation) {
        //动画被取消之后的处理
    }

    @Override
    public void onAnimationRepeat(Animator animation) {
      //动画重复的处理
    }
});
animator.setDuration(6000);
animator.start(); 
一般情况下,可以根据需要重写的方法选择监听器。


猜你喜欢

转载自blog.csdn.net/zhaozhiwen6140/article/details/52026871