Android 通过PathMeasure和Path实现动画

  最近一直在学习android框架,也就没怎么写博客了。前几天看到微信里推送的一篇博客,觉得动画很酷炫,就钻研了一番,这里我只是简单实现下,并说说实现原理和遇到的坑。有兴趣的可以参考:http://blog.csdn.net/zxt0601/article/details/53040506
这里面详细介绍了一番。实现方法 有些差异。
 
效果图:



  这里我通过PathMeasure和Path实现,简单介绍下PathMeasure
  PathMeasure是用来操作Path的,初始化
 mPathMeasure=new PathMeasure();
        //forceClosed 就是Path最终是否需要闭合,如果为True的话,则不管关联的Path是否是闭合的,都会被闭合 PathMeasure的计算就会包含最后一段闭合的路径
        mPathMeasure.setPath(mPath,false);



得到path长度,可以这样理解,不管实际 Path 多么的复杂,PathMeasure 都相当于做了一个事情,就是把 Path “拉直”,然后给了我们一个接口(getLength)告诉我们path的总长度,
mPathMeasure.getLength()

注意 这里得到的length是当前mPathMeasure指向线段的长度,并不是path总长度,如果要得到总长度需要通过nextContour来遍历mPathMeasure,得到每段长度再加起来



得到Path中的某一点或某一段
getPosTan(float distance, float[] pos, float[] tan)
getSegment(float startD, float stopD, Path dst, boolean startWithMoveTo)

这里要注意的是得到的线段是添加进 dst中的,并不是给dst重新赋值,如果想要重新生成一个线段,可以先重置dst  path.reset().
startWithMoveTo
为true:再次截取,起始点为0时,还是原path的起始点。
为false:再次截取,起始点为0时,为上次截取的终点。
startD stopD 是当前PathMeasure指向线段的开始和起始位置


Path 可以由多条曲线构成,但不论是 getLength , getgetSegment 或者是其它方法,都只会在其中第一条线段上运行,而这个 nextContour 就是用于跳转到下一条曲线到方法,如果跳转成功,则返回 true, 如果跳转失败,则返回 false。

这里要注意开始时直接调用 mPathMeasure.nextContour ()会跳到第一条线段,但如果你操作了mPathMeasure,如getLength,它会自动跳到第一条线段。


实现原理很简单 将想要显示的图案生成path,在onDraw绘制,然后就通过mPathMeasure不断得到想要高亮显示的路径,再在onDraw绘制出来

demo:https://github.com/592713711/HeartAnimDemo

猜你喜欢

转载自592713711.iteye.com/blog/2347120