属性动画
分两种:ValueAnimator
和ObjectAnimator
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
表示动画的类型alpha
或scaleX
...
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()
对每次更新的监听;
- addListener()
-
移除监听:
有时候一个动画可能不只调用一次,一定要记得,在重新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,但其实不实用。
不正经的程序员第一次写技术博客,是工作中的小记录~
有时候要记得去观察名字,从一个变量、对象或方法的名字上,便可知道它的用处,这也说明,平常我们在写代码的时候要学会命名,一个好的名字可大大加强代码的可读性。
已上是对日常的记录,如发现错误,请留言,谢谢!