如何通過自定義View方式模擬SVG并實現動畫

先來看一下最終效果!

效果圖

簡介:前面的文章里有介紹如何利用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);

到這里就全部完成了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,241評論 4 61
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,287評論 25 708
  • 每天都需要做計劃,根據自己的經驗推薦幾款手機清單app: 安卓版:滴答清單,奇妙清單,高效todo 蘋果版:bear
    囤糧的松鼠閱讀 661評論 0 0
  • 每一次回家,都是一次記憶,一次典禮,說不上盛大,但卻是那么珍惜。旅途的顛簸,不能泯滅些許激動的心。但想到這忙忙...
    算法成癮者閱讀 79評論 1 2
  • 工作是為了更好地生活。 一種觀點的出現,很少有全部贊同這種事情的出現。于是,前天聽到了這一個觀點。 工作是為了更好...
    素獻susie閱讀 1,183評論 0 0