先來看一下最終效果!
效果圖
簡介:前面的文章里有介紹如何利用svg的相關方法來實現如圖所示的矢量且可控制的Path動畫,然而,雖然svg動畫出來這么久了,前面的文章里也有提到,在有些低版本的api中,暫時還不支持用svg做path變化的動畫,所以,這里介紹一種本人認為可以自己利用Path類來模擬一個svg的效果。
關鍵類
Path,PathMeasure,Canvas
實現步驟
1.首先需要知道要實現的完整的圖像是什么樣子的,也就是我圖中的五角星形狀:
Path star = new Path();
star.moveTo(100,100);
star.rLineTo(200,0);
star.lineTo(100,200);
star.lineTo(200,50);
star.lineTo(300,200);
star.close();
這樣我的五角星就準備好了;
2.然后我們需要另外一個Path對象,用來存儲我們裁剪之后的Path路徑;
Path path2 = new Path();
3.然后我們要進行對五角星動畫的裁剪,涉及到的方法是PathMeasure的getLength和getSegment方法,getLength()不用多說,就是用來獲取path的總長度,getSegment是用來截取它其中的一部分,他的用法是:
boolean getSegment (float startD, float stopD, Path dst, boolean startWithMoveTo)
方法各個參數釋義:
參數 | 作用 | 備注 |
---|---|---|
返回值(boolean) | 判斷截取是否成功 true | 表示截取成功,結果存入dst中,false 截取失敗,不會改變dst中內容 |
startD | 開始截取位置距離 | Path 起點的長度取值范圍: 0 <= startD < stopD <= Path總長度 |
stopD | 結束截取位置距離 | Path 起點的長度取值范圍: 0 <= startD < stopD <= Path總長度 |
dst | 截取的 Path 將會添加到 dst 中 | 注意: 是添加,而不是替換 |
startWithMoveTo | 起始點是否使用 moveTo | 用于保證截取的 Path 第一個點位置不變 |
4.完成裁剪,并實現動畫過程:
final PathMeasure pathMeasure = new PathMeasure(star,true);
ObjectAnimator objectAnimator = new ObjectAnimator();
objectAnimator.setFloatValues(0,pathMeasure.getLength());
objectAnimator.setDuration(3000);
objectAnimator.setInterpolator(new AccelerateInterpolator());
objectAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
path2.reset(); //每次裁剪前先清空path2
pathMeasure.getSegment(0, (Float)animation.getAnimatedValue(),path2,true); //進行裁剪并存儲
invalidate();
}
});
objectAnimator.setRepeatCount(-1);
objectAnimator.setRepeatMode(ValueAnimator.REVERSE);
objectAnimator.start();
5.最后一步,完成繪制,這一步就不用多說了,直接上代碼:
canvas.drawPath(path2, paint);
到這里就全部完成了。