Android属动画ObjectAnimator和ValueAnimator应用

Posted Jason_Lee155

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android属动画ObjectAnimator和ValueAnimator应用相关的知识,希望对你有一定的参考价值。

区别:

ObjectAnimator 是直接对某个view进行更改。

ValueAnimator 根据 TimeInterpolator 在不断产生相应的数据,来传进view  ,view自己做改变。

介绍:

  1. 属性动画是通过改变某个控件的属性值来创造动画,比如在规定的时间内改变某个控件的X坐标,则会产生一个平移的动画效果。
  2. 坚持使用属性动画和帧动画,而不要使用补间动画,补间动画会造成控件移动到目的地但是控件的热点(产生事件的范围)仍然在原地。
  3. 属性动画几乎可以产生一切你想要的效果,一般在插入动画时,默认为匀速从起点到终点,可以通过插值改变从起点到终点的效果
  4. 属性动画分为ObjectAnimator和ValueAnimator,其中ObjectAnimator是继承于ValueAnimator

ObjectAnimator

对控件的某个属性执行一次动画。

1.通过 ObjectAnimator.ofFloat(<控件>,<控件属性>,<从什么float值>,<到什么float值>).setDuration(1000).start();来创建一次动画。

其中ofFloat是根据后面属性值的类型设置的。如果是整型,可以设置为ofInt。

如果有多个这样的,一次执行并不会分先后顺序,是一起执行,包括对同一控件的操作,因为设置动画并不会阻碍主线程。

   //旋转动画  rotationX,Y分别代表绕着X,Y轴旋转,rotation表示围绕Z轴旋转
   ObjectAnimator rotationX = ObjectAnimator.ofFloat(mImage, "rotation", 0.5f, 360f);
   //缩放动画  scaleX,Y分别代表沿着X,Y轴旋转
   ObjectAnimator scaleX = ObjectAnimator.ofFloat(mImage, "scaleX", 0, 1);
  //透明度动画    0 -> 1从完全透明到完全不透明
   ObjectAnimator alpha = ObjectAnimator.ofFloat(mImage, "alpha", 0, 1);
   //平移动画   translationX,Y沿着X,Y轴平移
   ObjectAnimator translationX = ObjectAnimator.ofFloat(mImage, "translationX", 500);

另外,如果控件属性是自定义的,这个属性一定要实现getter和setter。

ObjectAnimator animator1 = ObjectAnimator.ofFloat(progressVew, "progress", 0, 100);

    public void setProgress(float progress) {
        this.progress = progress;
        invalidate();
    }

    public float getProgress() {
        return progress;
    }

2.为了是属性复用化,节省代码操作,我们把对控件的一组属性的一次操作提取出来称为一个属性操作集,比如,我想对控件进行平移和旋转,我们可以先把平移和旋转(以及他们操作的数值)单独拿出来作为一个属性,然后控件调用这个动画集,就可以实现无论什么控件都可以公用这个属性动画。

操作:

通过 PropertyValuesHolder pro = PropertyValuesHolder.ofFloat("translationX",0F,100F);封装平移X的动画。

然后PropertyValuesHolder pro2 =PropertyValuesHolder.ofFloat("rotation",0F,360F);封装旋转360的动画。

最后通过ObjectAnimator.ofPropertyValuesHolder(<控件>,pro,pro1,pro2);来为某个控件设置以上动画,其他控件也可复用以上代码。

3.以上只是说明了对控件的多个属性一次操作,并没有说明控件属性改变的先后顺序,以及对多个控件一起操作。

这是我们引入了AnimatorSet先实例化这个属性动画集合 AnimatorSet set = new AnimatorSet().

通过set.play(<animator1>).with(<animator2>);来表示让Animator1和Animator2一起执行,

通过set.play(<animator1>).after(<animator2>)来表示让Animator1在Animator2后执行

通过set.play(<animator1>).before(<animator2>)来表示让Animator1在Animator2之前执行、

其中Animator1和Animator2都可以填充ObjectAnimator。这样就可以对某个控件的先后顺序和对多个控件的动画配合起到至关作用。

4.以上所表示的动画都是将某个属性从一个值匀速的改变成另一个值。

我们可以用set.setInterpolator();来设置一个改变的效果。里面只要new 一个Interpolator方可,比如:set.setInterpolator(new AccelerateInterpolator());

//透明度动画值:开始透明度,结束透明度...
//可以设置多个值让他反复变化
ObjectAnimator.ofFloat(mView.ivShow, "alpha", 1, 0)
        .setDuration(5000)
        .start();
ObjectAnimator.ofFloat(mView.ivShow, "alpha", 1, 0, 1)
        .setDuration(5000)
        .start();

ValueAnimator

1.ValueAnimator并不会改变属性的大小,他只是在一段时间生成某些值,比如上面的ofFloat中设置了从0F,100F,并设置时间为1000。则ValueAnimator的作用就是在1000中匀速生成0F到100F的值,然后再为控件在1000中为控件的属性设上不同值,这就是动画的原理。

我们可以通过线程和线程休眠来设置动画,但是这样太占用资源,所以我们不建议使用线程而使用Animator。

2.我们可以获取1000内产生的值

ValueAnimator value = ValueAnimator.ofFloat(0F,100F);
        value.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                  float value = (float) animation.getAnimatedValue();
                           // 把这个value设置给控件的某一个属性
            }
        });

这样就可以获取,我们可以通过设置一个计时器,就是每秒就为控件设置获取到的值。

3.我们可以自定义获取的值(通过泛型),这样就显得更加灵活,可以在一段时间内得到我们想要的值

value.ofObject(new TypeEvaluator<Float>() {
        @Override
         public Float evaluate(float fraction, Float startValue, Float endValue) {
            return null; 
// 这里可以自己自定义 返回的数据  , fraction 是0到1之间的数 这里确定的是每一帧的数据
          }
     },0F,100F);

new TypeEvaluator<Boolean>() {
            @Override
            public Boolean evaluate(float fraction, Boolean startValue, Boolean endValue) {
                return null;
            }

        };

此时我们可以反回任意的值,其中fraction是从0到1,相当于进度的百分比 我们可以通过条件语句判断来反回真正需要反回的值,然后通过addUpdateListener    就可以很灵活的实现各种值的返回。

4. 我们还可以控制动画的执行速度 运用插值器

mAnimator.setInterpolator(new Interpolator() {
            @Override
            public float getInterpolation(float input) {
                return 0;
//  这里 input与 return 都是0到1之间的数  , 两者之间我们可以编写 y = f(x) 的函数,斜率变化 就是我们动画的播放速率变化
            }
        });

 常见插值器:

AccelerateDecelerateInterpolator   在动画开始与介绍的地方速率改变比较慢,在中间的时候加速
    AccelerateInterpolator                     在动画开始的地方速率改变比较慢,然后开始加速
    AnticipateInterpolator                      开始的时候向后然后向前甩
    AnticipateOvershootInterpolator     开始的时候向后然后向前甩一定值后返回最后的值
    BounceInterpolator                          动画结束的时候弹起
    CycleInterpolator                             动画循环播放特定的次数,速率改变沿着正弦曲线
    DecelerateInterpolator                    在动画开始的地方快然后慢
    LinearInterpolator                            以常量速率改变
    OvershootInterpolator                      向前甩一定值后再回到原来位置

以上是关于Android属动画ObjectAnimator和ValueAnimator应用的主要内容,如果未能解决你的问题,请参考以下文章

Android objectAnimator animate backgroundColor of Layout

恒速的Android ObjectAnimator

Android动画——属性动画

一起Talk Android吧(第四百八十八回:ObjectAnimator)

android中的动画之属性动画

Android动画总结