三. 总结
2017-11-26 本文已影响2人
真胖大海
自定义视图实现动画的两种思路
方式一. 不使用属性动画。
- 如果自定视图中有动画效果,一般涉及到两个变量一个渐变量(如BeatNumber中的textYOffset,ThunView中的mNowSweepAngle),和一个动画完成程度变量。通过改变渐变量的值和对渐变量临界值的判断来驱动动画和停止动画。
- 动画的实现思路一般是
先给出“绘制内容代码”,然后再根据如下的模板代码实现
//根据参数绘制
绘制内容代码
//判断
if(参数满足条件){
invalidate();//重绘
}else{
根据需要重置参数
}
方式二.使用属性动画
1.onDraw中根据一个“渐变量/完成度变量”来绘制内容,属性动画驱动这个变量的改变来实现动画
如下,实现了一个简单的半径不断改变的圆的动画效果。
public class MyCircleView extends View{
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int cx = getMeasuredWidth() / 2;
int cy = getMeasuredHeight() / 2;
canvas.drawCircle(cx, cy,getMeasuredWidth()/2*mPercent,mPaint);
}
public float getPercent() {
return mPercent;
}
public void setPercent(float percent) {
this.mPercent = percent;
postInvalidate();
}
private void useObjectAnimatorCircle(MyCircleView myCircleView) {
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(myCircleView,"percent",0.0f,1f);
objectAnimator.setDuration(2000);
objectAnimator.setRepeatCount(ValueAnimator.INFINITE);
objectAnimator.setRepeatMode(ValueAnimator.REVERSE);
objectAnimator.start();
}
}
总结
方式1 是通过在onDraw中改变“渐变量/完成度变量” 来驱动动画
方式2 是通过属性动画来改变“渐变量/完成度变量”
个人认为
方式1适合较为复杂的动画,
方式2适合较为简单的动画(而且属性动画通过插值器可以产生一些很有规律的数值)