自定義視圖實現(xiàn)動畫的兩種思路
方式一. 不使用屬性動畫。
- 如果自定視圖中有動畫效果,一般涉及到兩個變量一個漸變量(如BeatNumber中的textYOffset,ThunView中的mNowSweepAngle),和一個動畫完成程度變量。通過改變漸變量的值和對漸變量臨界值的判斷來驅(qū)動動畫和停止動畫。
- 動畫的實現(xiàn)思路一般是
先給出“繪制內(nèi)容代碼”,然后再根據(jù)如下的模板代碼實現(xiàn)
//根據(jù)參數(shù)繪制
繪制內(nèi)容代碼
//判斷
if(參數(shù)滿足條件){
invalidate();//重繪
}else{
根據(jù)需要重置參數(shù)
}
方式二.使用屬性動畫
1.onDraw中根據(jù)一個“漸變量/完成度變量”來繪制內(nèi)容,屬性動畫驅(qū)動這個變量的改變來實現(xiàn)動畫
如下,實現(xiàn)了一個簡單的半徑不斷改變的圓的動畫效果。
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();
}
}
總結(jié)
方式1 是通過在onDraw中改變“漸變量/完成度變量” 來驅(qū)動動畫
方式2 是通過屬性動畫來改變“漸變量/完成度變量”
個人認為
方式1適合較為復雜的動畫,
方式2適合較為簡單的動畫(而且屬性動畫通過插值器可以產(chǎn)生一些很有規(guī)律的數(shù)值)