Animator 记录

属性动画
分两种:ValueAnimatorObjectAnimator

ValueAnimator

ValueAnimator对值做动画运算,而非对控件。

基本实现:

ValueAnimator animator = ValueAnimator.ofInt(0, 100);
animator.setDuration(1000);
animator.start();

设置了一个从整型0-100变化的动画,时间为1000毫秒;

设置监听:

animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
     @Override
     public void onAnimationUpdate(ValueAnimator animation) {
           //动画每次更新时都会调用;可对需要每次都变动的view进行处理
           int temp = (int) animation.getAnimatedValue();
     }
});

animator.addListener(new AnimatorListenerAdapter() {
     @Override
     public void onAnimationCancel(Animator animation) {
         super.onAnimationCancel(animation);
         //cancel 时会被调用
         
     }

     @Override
     public void onAnimationStart(Animator animation) {
         super.onAnimationStart(animation);
         //动画开始时被调用,可对一些控件进行操作
         
     }
            
     @Override
     public void onAnimationEnd(Animator animation) {
        super.onAnimationEnd(animation);
        //动画结束时被调用
        ...
        //对动画结束后需要更新的view等进行处理;
        
     }
});
        

addUpdateListener 会监听整个动画过程,动画由许多帧组成,每播放一次,都会调用一次onAnimationUpdate.

AnimatorListener 可以监听动画的开始结束和取消以及重复播放,同时提供了AnimatorListenerAdapter, 可以有选择的实现接口中的方法。

animation.getAnimatedValue() 与 animation.getAnimatedFraction()

  • animation.getAnimatedValue: 取得是指!

    • animator = ValueAnimator.ofObject(new ArgbEvalutor, beginColor, translateColor);

      那么getAnimatedValue的获取的是颜色的argb 型的从(beginColor, translateColor) 的一个颜色值对象。

    ArgbEvalutor 可以用做执行一个特定类型(表示argb color)的interpolation,在两者间进行评估(evalutor).

  • animation.getAnimatedFraction(): 取得是 0 - 1 的百分占比;

对自定义view添加动画

自定义view最为重要的是onDraw(), 在初始化时会被调用一次

对于需要动态变化的view,则需要多次调用onDraw(), 可利用invalidate()去不断的调用onDraw().

可在view内部开放一个对外的方法接口:

public void startScale() {
    
    ...
    ValueAnimator scaleAnimator = ValueAnimator.ofFloat(1, 1.2f, 1);
    scaleAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
         @Override
         public void onAnimationUpdate(ValueAnimator animation) {
            ...
            //调用onDraw()
            invalidate();
         }
    });
}
  • onSizedChanged()里可得到view的宽和高

    它的被调用时机是在view的大小发生变化。

对自定义view 的要求:不浪费每一行代码,对每一行代码的深意都要理解到位。

ObjectAnimator

ObjectAnimator是对某个控件做动画,可以对某一个view对象设置动画,后面的String 表示动画的类型alphascaleX...

ObjectAnimator iconZoomAlpha = ObjectAnimator.ofFloat(iconViewLayout, "alpha", 0.0f, 1.0f);
ObjectAnimator iconZoomScaleX = ObjectAnimator.ofFloat(iconViewLayout, "scaleX", 0.4f, 1.0f);
ObjectAnimator iconZoomScaleY = ObjectAnimator.ofFloat(iconViewLayout, "scaleY", 0.4f, 1.0f);

同时可以为其设置一个AnimatorSet,把这些动画统一起来;

AnimatorSet iconSet = new AnimatorSet();
iconSet.playTogether(iconZoomAlpha, iconZoomScaleX, iconZoomScaleY);
iconSet.start();
//z同时可设置动画的先后执行顺序:
iconSet.play(iconZoomAlpha).after(iconZoomScaleX).before(iconZoomScaleY);
//先执行iconZoomScaleX, 第二是iconZoomAlpha, 第三是iconZoomScaleY.

动画监听的处理

  • 添加监听:

    • addListener()
      里面有五种事件的监听;
    • addUpdateListener()
      对每次更新的监听;
  • 移除监听:
    有时候一个动画可能不只调用一次,一定要记得,在重新start之前,要先把之前的listener全部取消掉,不然会有多个listener同时在监听,同时会有多个事件的逻辑被触发;

    animator.removeAllListeners();
    ...
    animator.start();
    
    • 动画要及时处理,防止内存泄漏:

      当界面被强制退出时,可能动画尚未结束,需要对动画进行处理

      if(animator != null) {
          animator.removeAllListeners();
          animator.cancel();
      }
      

      注意:因为在cancel()时会去调用animator.onAnimationEnd()的监听事件,所以要再cancel()前取消animator的所有监听事件。

      同时要注意思考,此动画是否在onAnimationEnd()里做了动画结束后其他事物逻辑的处理,若有,则需要执行,不能remove。

  • 移除监听的方式:

    • removeUpdateListener(AnimatorUpdateListener listener);

    • removeAllUpdateListener();

    • removeAllListener();

    • removeListener(AnimatorListener listener);

      取消一个指定的listener,但其实不实用。

不正经的程序员第一次写技术博客,是工作中的小记录~

有时候要记得去观察名字,从一个变量、对象或方法的名字上,便可知道它的用处,这也说明,平常我们在写代码的时候要学会命名,一个好的名字可大大加强代码的可读性。

已上是对日常的记录,如发现错误,请留言,谢谢!

你可能感兴趣的:(Animator 记录)