Animator 记录

作者: chendroid | 来源:发表于2017-09-14 10:35 被阅读37次

    属性动画
    分两种: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 记录

        本文链接:https://www.haomeiwen.com/subject/uzbrsxtx.html