技术二三Android知识

Animator 记录

2017-09-14  本文已影响37人  chendroid

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

对自定义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();
         }
    });
}

对自定义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.

动画监听的处理

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

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

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

上一篇 下一篇

猜你喜欢

热点阅读