1050显卡 8G内存 可以玩方舟生存进化烧显卡么

2012年3月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。> 问题详情
求解Java程序设计编写一个日期对应的星期几程序
悬赏:0&答案豆
提问人:匿名网友
发布时间:
求解Java程序设计编写一个日期对应的星期几程序
论文写作技巧
我有更好的答案
请先输入下方的验证码查看最佳答案
图形验证:
验证码提交中……PathMeasure之迷径追踪
Path,不论是在自定义View还是动画,都占有举足轻重的地位。绘制Path,可以通过提供的API,或者是贝塞尔曲线、数学函数、图形组合等等方式,而要获取Path上每一个构成点的坐标,一般需要知道Path的函数方法,例如求解贝塞尔曲线上的点的De
Casteljau算法,但对于一般的Path来说,是很难通过简单的函数方法来进行计算的,那么,如何来定位任意一个给定Path的任意一个点的坐标呢?
Android SDK提供了一个非常有用的API来帮助开发者实现这样一个Path路径点的坐标追踪,这个类就是PathMeasure,它可以认为是一个Path的坐标计算器。
PathMeasure类似一个计算器,对它进行初始化只需要new一个PathMeasure对象即可:
&code class=&hljs fix has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&&span class=&hljs-attribute& style=&box-sizing: border-&&PathMeasure pathMeasure &/span&=&span class=&hljs-string& style=&color: rgb(0, 136, 0); box-sizing: border-&& new PathMeasure();&/span&&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&/ul&
初始化PathMeasure后,可以通过PathMeasure.setPath()的方式来将Path和PathMeasure进行绑定,例如:
&code class=&hljs bash has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&pathMeasure.setPath(path, &span class=&hljs-literal& style=&color: rgb(0, 102, 102); box-sizing: border-&&true&/span&);&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&/ul&
当然,你也可以直接使用PathMeasure的有参构造方法来进行初始化:
&code class=&hljs java has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&PathMeasure (Path path, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&boolean&/span& forceClosed)&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&/ul&
这里最不容易理解的就是第二个boolean参数forceClosed。
forceClosed参数
这个参数——forceClosed,简单的说,就是Path最终是否需要闭合,如果为True的话,则不管关联的Path是否是闭合的,都会被闭合。
但是这个参数对Path和PathMeasure的影响是需要解释下的:
forceClosed参数对绑定的Path不会产生任何影响,例如一个折线段的Path,本身是没有闭合的,forceClosed设置为True的时候,PathMeasure计算的Path是闭合的,但Path本身绘制出来是不会闭合的。forceClosed参数对PathMeasure的测量结果有影响,还是例如前面说的一个折线段的Path,本身没有闭合,forceClosed设置为True,PathMeasure的计算就会包含最后一段闭合的路径,与原来的Path不同。
PathMeasure的API非常容易理解,几乎都是望文生义。
PathMeasure.getLength()的使用非常广泛,其作用就是获取计算的路径长度。
getSegment
&code class=&hljs java has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&boolean&/span& getSegment (&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span& startD, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span& stopD, Path dst, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&boolean&/span& startWithMoveTo)&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&/ul&
这个API用于截取整个Path的片段,通过参数startD和stopD来控制截取的长度,并将截取的Path保存到dst中,最后一个参数startWithMoveTo表示起始点是否使用moveTo方法,通常为True,保证每次截取的Path片段都是正常的、完整的。
如果startWithMoveTo设置为false,通常是和dst一起使用,因为dst中保存的Path是被不断添加的,而不是每次被覆盖,设置为false,则新增的片段会从上一次Path终点开始计算,这样可以保存截取的Path片段数组连续起来。
nextContour
nextContour()方法用的比较少,比较大部分情况下都只会有一个Path而不是多个,毕竟这样会增加Path的复杂度,但是如果真有一个Path,包含了多个Path,那么通过nextContour这个方法,就可以进行切换,同时,默认的API,例如getLength,获取的也是当前的这段Path所对应的长度,而不是所有的Path的长度,同时,nextContour获取Path的顺序,与Path的添加顺序是相同的。
&code class=&hljs glsl has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&boolean getPosTan (&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span& &span class=&hljs-built_in& style=&color: rgb(102, 0, 102); box-sizing: border-&&distance&/span&, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span&[] pos, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span&[] &span class=&hljs-built_in& style=&color: rgb(102, 0, 102); box-sizing: border-&&tan&/span&)&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&/ul&
这个API用于获取路径上某点的坐标及其切线的坐标,这个API非常强大,但是比较难理解,后面会结合例子来讲解。
简单的说,就是通过指定distance(0
硬件加速的Bug
由于硬件加速的问题,PathMeasure中的getSegment在讲Path添加到dst数组中时会被导致一些错误,需要通过mDst.lineTo(0,0)来避免这样一个Bug。
路径绘制是PathMeasure最常用的功能,其原理就是通过getSegment来不断截取Path片段,从而不断绘制完整的路径,效果如图所示:
代码如下所示:
&code class=&hljs java has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&package&/span& .pathart.
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.animation.ValueA
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.content.C
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.graphics.C
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.graphics.P
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.graphics.P
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.graphics.PathM
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.util.AttributeS
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.view.V
&span class=&hljs-javadoc& style=&color: rgb(136, 0, 0); box-sizing: border-&&/**
* 路径动画 PathMeasure
* Created by xuyisheng on 16/7/15.
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-class& style=&box-sizing: border-&&&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&class&/span& &span class=&hljs-title& style=&box-sizing: border- color: rgb(102, 0, 102);&&PathPainter&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&extends&/span& &span class=&hljs-title& style=&box-sizing: border- color: rgb(102, 0, 102);&&View&/span& {&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& Path mP
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& Paint mP
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& PathMeasure mPathM
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span& mAnimatorV
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& Path mD
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span& mL
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-title& style=&box-sizing: border-&&PathPainter&/span&(Context context) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&super&/span&(context);
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-title& style=&box-sizing: border-&&PathPainter&/span&(Context context, AttributeSet attrs) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&super&/span&(context, attrs);
mPathMeasure = &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& PathMeasure();
mPaint = &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&5&/span&);
mPath = &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& Path();
mPath.addCircle(&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&400&/span&, &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&400&/span&, &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&100&/span&, Path.Direction.CW);
mPathMeasure.setPath(mPath, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&true&/span&);
mLength = mPathMeasure.getLength();
mDst = &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& Path();
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&final&/span& ValueAnimator valueAnimator = ValueAnimator.ofFloat(&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&, &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1&/span&);
valueAnimator.addUpdateListener(&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& ValueAnimator.AnimatorUpdateListener() {
&span class=&hljs-annotation& style=&color: rgb(155, 133, 157); box-sizing: border-&&@Override&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&onAnimationUpdate&/span&(ValueAnimator valueAnimator) {
mAnimatorValue = (&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span&) valueAnimator.getAnimatedValue();
invalidate();
valueAnimator.setDuration(&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&2000&/span&);
valueAnimator.setRepeatCount(ValueAnimator.INFINITE);
valueAnimator.start();
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-title& style=&box-sizing: border-&&PathPainter&/span&(Context context, AttributeSet attrs, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& defStyleAttr) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&super&/span&(context, attrs, defStyleAttr);
&span class=&hljs-annotation& style=&color: rgb(155, 133, 157); box-sizing: border-&&@Override&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&protected&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&onDraw&/span&(Canvas canvas) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&super&/span&.onDraw(canvas);
mDst.reset();
&span class=&hljs-comment& style=&color: rgb(136, 0, 0); box-sizing: border-&&// 硬件加速的BUG&/span&
mDst.lineTo(&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&,&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&);
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span& stop = mLength * mAnimatorV
mPathMeasure.getSegment(&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&, stop, mDst, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&true&/span&);
canvas.drawPath(mDst, mPaint);
&/code&&p&&code class=&hljs java has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&
}&/code&&code class=&hljs java has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&
&/code&&code class=&hljs java has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&
&/code&&code class=&hljs java has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&&/code&&/p&&p style=&margin-top: 0 margin-bottom: 1.1 padding-top: 0 padding-bottom: 0 box-sizing: border- color: rgb(85, 85, 85); font-family: 'microsoft yahei'; font-size: 14 line-height: 35&&通过这种方式,只需要做一点点小的修改,就可以完成一个比较有意思的loading图,效果如下所示:&/p&&p style=&margin-top: 0 margin-bottom: 1.1 padding-top: 0 padding-bottom: 0 box-sizing: border- color: rgb(85, 85, 85); font-family: 'microsoft yahei'; font-size: 14 line-height: 35&&&img src=&http://img.blog.csdn.net/13306& alt=&这里写图片描述& title=&& style=&border: box-sizing: border- max-width: 602 height:& /&&/p&&p style=&margin-top: 0 margin-bottom: 1.1 padding-top: 0 padding-bottom: 0 box-sizing: border- color: rgb(85, 85, 85); font-family: 'microsoft yahei'; font-size: 14 line-height: 35&&我们只需要修改下起始值的数字即可,关键代码如下:&/p&&pre class=&prettyprint& name=&code& style=&white-space: word-wrap: break- box-sizing: border- position: overflow-y: overflow-x: margin-top: 0 margin-bottom: 1.1 font-family: 'Source Code Pro', padding: 5px 5px 5px 60 font-size: 14 line-height: 1.45; word-break: break- color: rgb(51, 51, 51); border: 1px solid rgba(128, 128, 128, 0.0745098); border-radius: 0 background-color: rgba(128, 128, 128, 0.0470588);&&&code class=&hljs java has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&&span class=&hljs-annotation& style=&color: rgb(155, 133, 157); box-sizing: border-&&@Override&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&protected&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&onDraw&/span&(Canvas canvas) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&super&/span&.onDraw(canvas);
mDst.reset();
&span class=&hljs-comment& style=&color: rgb(136, 0, 0); box-sizing: border-&&// 硬件加速的BUG&/span&
mDst.lineTo(&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&,&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&);
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span& stop = mLength * mAnimatorV
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span& start = (&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span&) (stop - ((&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0.5&/span& - Math.abs(mAnimatorValue - &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0.5&/span&)) * mLength));
mPathMeasure.getSegment(start, stop, mDst, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&true&/span&);
canvas.drawPath(mDst, mPaint);
}&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&/ul&
路径绘制——另辟蹊径
关于路径绘制,View的始祖Romain Guy曾经有一篇文章讲解了一个很使用的技巧,地址如下所示:
Romain Guy使用DashPathEffect来实现了路径绘制。
&code class=&hljs cs has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&DashPathEffect(&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span&[] intervals, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span& phase)&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&/ul&
DashPathEffect传入了一个intervals数组,用来控制实线和虚线的数组的显示,那么当实线和虚线都是整个路径的长度时,整个路径就只显示实线或者虚线了,这时候通过第二个参数phase来控制起始偏移量,就可以完成整个路径的绘制了,这的确是一个非常trick而且有效的方式,效果如图所示:
代码如下所示:
&code class=&hljs java has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&package&/span& .pathart.
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.animation.ValueA
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.content.C
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.graphics.C
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.graphics.C
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.graphics.DashPathE
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.graphics.P
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.graphics.P
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.graphics.PathE
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.graphics.PathM
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.util.AttributeS
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.view.V
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.view.animation.AccelerateDecelerateI
&span class=&hljs-javadoc& style=&color: rgb(136, 0, 0); box-sizing: border-&&/**
* 路径绘制——DashPathEffect
* Created by xuyisheng on 16/7/15.
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-class& style=&box-sizing: border-&&&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&class&/span& &span class=&hljs-title& style=&box-sizing: border- color: rgb(102, 0, 102);&&PathPainterEffect&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&extends&/span& &span class=&hljs-title& style=&box-sizing: border- color: rgb(102, 0, 102);&&View&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&implements&/span& &span class=&hljs-title& style=&box-sizing: border- color: rgb(102, 0, 102);&&View&/span&.&span class=&hljs-title& style=&box-sizing: border- color: rgb(102, 0, 102);&&OnClickListener&/span&{&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& Paint mP
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& Path mP
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& PathMeasure mPathM
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& PathEffect mE
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span& fraction = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&;
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& ValueAnimator mA
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-title& style=&box-sizing: border-&&PathPainterEffect&/span&(Context context) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&super&/span&(context);
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-title& style=&box-sizing: border-&&PathPainterEffect&/span&(Context context, AttributeSet attrs) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&super&/span&(context, attrs);
mPath = &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& Path();
mPath.reset();
mPath.moveTo(&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&100&/span&, &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&100&/span&);
mPath.lineTo(&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&100&/span&, &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&500&/span&);
mPath.lineTo(&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&400&/span&, &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&300&/span&);
mPath.close();
mPaint = &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& Paint();
mPaint.setColor(Color.BLACK);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&5&/span&);
mPathMeasure = &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& PathMeasure(mPath, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&false&/span&);
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&final&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span& length = mPathMeasure.getLength();
mAnimator = ValueAnimator.ofFloat(&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1&/span&, &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&);
mAnimator.setInterpolator(&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& AccelerateDecelerateInterpolator());
mAnimator.setDuration(&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&2000&/span&);
mAnimator.addUpdateListener(&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& ValueAnimator.AnimatorUpdateListener() {
&span class=&hljs-annotation& style=&color: rgb(155, 133, 157); box-sizing: border-&&@Override&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&onAnimationUpdate&/span&(ValueAnimator valueAnimator) {
fraction = (&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span&) valueAnimator.getAnimatedValue();
mEffect = &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& DashPathEffect(&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span&[]{length, length}, fraction * length);
mPaint.setPathEffect(mEffect);
invalidate();
setOnClickListener(&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&this&/span&);
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-title& style=&box-sizing: border-&&PathPainterEffect&/span&(Context context, AttributeSet attrs, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& defStyleAttr) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&super&/span&(context, attrs, defStyleAttr);
&span class=&hljs-annotation& style=&color: rgb(155, 133, 157); box-sizing: border-&&@Override&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&protected&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&onDraw&/span&(Canvas canvas) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&super&/span&.onDraw(canvas);
canvas.drawPath(mPath, mPaint);
&span class=&hljs-annotation& style=&color: rgb(155, 133, 157); box-sizing: border-&&@Override&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&onClick&/span&(View view) {
mAnimator.start();
&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&li style=&box-sizing: border- padding: 0px 5&&12&/li&&li style=&box-sizing: border- padding: 0px 5&&13&/li&&li style=&box-sizing: border- padding: 0px 5&&14&/li&&li style=&box-sizing: border- padding: 0px 5&&15&/li&&li style=&box-sizing: border- padding: 0px 5&&16&/li&&li style=&box-sizing: border- padding: 0px 5&&17&/li&&li style=&box-sizing: border- padding: 0px 5&&18&/li&&li style=&box-sizing: border- padding: 0px 5&&19&/li&&li style=&box-sizing: border- padding: 0px 5&&20&/li&&li style=&box-sizing: border- padding: 0px 5&&21&/li&&li style=&box-sizing: border- padding: 0px 5&&22&/li&&li style=&box-sizing: border- padding: 0px 5&&23&/li&&li style=&box-sizing: border- padding: 0px 5&&24&/li&&li style=&box-sizing: border- padding: 0px 5&&25&/li&&li style=&box-sizing: border- padding: 0px 5&&26&/li&&li style=&box-sizing: border- padding: 0px 5&&27&/li&&li style=&box-sizing: border- padding: 0px 5&&28&/li&&li style=&box-sizing: border- padding: 0px 5&&29&/li&&li style=&box-sizing: border- padding: 0px 5&&30&/li&&li style=&box-sizing: border- padding: 0px 5&&31&/li&&li style=&box-sizing: border- padding: 0px 5&&32&/li&&li style=&box-sizing: border- padding: 0px 5&&33&/li&&li style=&box-sizing: border- padding: 0px 5&&34&/li&&li style=&box-sizing: border- padding: 0px 5&&35&/li&&li style=&box-sizing: border- padding: 0px 5&&36&/li&&li style=&box-sizing: border- padding: 0px 5&&37&/li&&li style=&box-sizing: border- padding: 0px 5&&38&/li&&li style=&box-sizing: border- padding: 0px 5&&39&/li&&li style=&box-sizing: border- padding: 0px 5&&40&/li&&li style=&box-sizing: border- padding: 0px 5&&41&/li&&li style=&box-sizing: border- padding: 0px 5&&42&/li&&li style=&box-sizing: border- padding: 0px 5&&43&/li&&li style=&box-sizing: border- padding: 0px 5&&44&/li&&li style=&box-sizing: border- padding: 0px 5&&45&/li&&li style=&box-sizing: border- padding: 0px 5&&46&/li&&li style=&box-sizing: border- padding: 0px 5&&47&/li&&li style=&box-sizing: border- padding: 0px 5&&48&/li&&li style=&box-sizing: border- padding: 0px 5&&49&/li&&li style=&box-sizing: border- padding: 0px 5&&50&/li&&li style=&box-sizing: border- padding: 0px 5&&51&/li&&li style=&box-sizing: border- padding: 0px 5&&52&/li&&li style=&box-sizing: border- padding: 0px 5&&53&/li&&li style=&box-sizing: border- padding: 0px 5&&54&/li&&li style=&box-sizing: border- padding: 0px 5&&55&/li&&li style=&box-sizing: border- padding: 0px 5&&56&/li&&li style=&box-sizing: border- padding: 0px 5&&57&/li&&li style=&box-sizing: border- padding: 0px 5&&58&/li&&li style=&box-sizing: border- padding: 0px 5&&59&/li&&li style=&box-sizing: border- padding: 0px 5&&60&/li&&li style=&box-sizing: border- padding: 0px 5&&61&/li&&li style=&box-sizing: border- padding: 0px 5&&62&/li&&li style=&box-sizing: border- padding: 0px 5&&63&/li&&li style=&box-sizing: border- padding: 0px 5&&64&/li&&li style=&box-sizing: border- padding: 0px 5&&65&/li&&li style=&box-sizing: border- padding: 0px 5&&66&/li&&li style=&box-sizing: border- padding: 0px 5&&67&/li&&li style=&box-sizing: border- padding: 0px 5&&68&/li&&li style=&box-sizing: border- padding: 0px 5&&69&/li&&li style=&box-sizing: border- padding: 0px 5&&70&/li&&li style=&box-sizing: border- padding: 0px 5&&71&/li&&li style=&box-sizing: border- padding: 0px 5&&72&/li&&li style=&box-sizing: border- padding: 0px 5&&73&/li&&li style=&box-sizing: border- padding: 0px 5&&74&/li&&li style=&box-sizing: border- padding: 0px 5&&75&/li&&li style=&box-sizing: border- padding: 0px 5&&76&/li&&li style=&box-sizing: border- padding: 0px 5&&77&/li&&li style=&box-sizing: border- padding: 0px 5&&78&/li&&li style=&box-sizing: border- padding: 0px 5&&79&/li&&li style=&box-sizing: border- padding: 0px 5&&80&/li&&li style=&box-sizing: border- padding: 0px 5&&81&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&li style=&box-sizing: border- padding: 0px 5&&12&/li&&li style=&box-sizing: border- padding: 0px 5&&13&/li&&li style=&box-sizing: border- padding: 0px 5&&14&/li&&li style=&box-sizing: border- padding: 0px 5&&15&/li&&li style=&box-sizing: border- padding: 0px 5&&16&/li&&li style=&box-sizing: border- padding: 0px 5&&17&/li&&li style=&box-sizing: border- padding: 0px 5&&18&/li&&li style=&box-sizing: border- padding: 0px 5&&19&/li&&li style=&box-sizing: border- padding: 0px 5&&20&/li&&li style=&box-sizing: border- padding: 0px 5&&21&/li&&li style=&box-sizing: border- padding: 0px 5&&22&/li&&li style=&box-sizing: border- padding: 0px 5&&23&/li&&li style=&box-sizing: border- padding: 0px 5&&24&/li&&li style=&box-sizing: border- padding: 0px 5&&25&/li&&li style=&box-sizing: border- padding: 0px 5&&26&/li&&li style=&box-sizing: border- padding: 0px 5&&27&/li&&li style=&box-sizing: border- padding: 0px 5&&28&/li&&li style=&box-sizing: border- padding: 0px 5&&29&/li&&li style=&box-sizing: border- padding: 0px 5&&30&/li&&li style=&box-sizing: border- padding: 0px 5&&31&/li&&li style=&box-sizing: border- padding: 0px 5&&32&/li&&li style=&box-sizing: border- padding: 0px 5&&33&/li&&li style=&box-sizing: border- padding: 0px 5&&34&/li&&li style=&box-sizing: border- padding: 0px 5&&35&/li&&li style=&box-sizing: border- padding: 0px 5&&36&/li&&li style=&box-sizing: border- padding: 0px 5&&37&/li&&li style=&box-sizing: border- padding: 0px 5&&38&/li&&li style=&box-sizing: border- padding: 0px 5&&39&/li&&li style=&box-sizing: border- padding: 0px 5&&40&/li&&li style=&box-sizing: border- padding: 0px 5&&41&/li&&li style=&box-sizing: border- padding: 0px 5&&42&/li&&li style=&box-sizing: border- padding: 0px 5&&43&/li&&li style=&box-sizing: border- padding: 0px 5&&44&/li&&li style=&box-sizing: border- padding: 0px 5&&45&/li&&li style=&box-sizing: border- padding: 0px 5&&46&/li&&li style=&box-sizing: border- padding: 0px 5&&47&/li&&li style=&box-sizing: border- padding: 0px 5&&48&/li&&li style=&box-sizing: border- padding: 0px 5&&49&/li&&li style=&box-sizing: border- padding: 0px 5&&50&/li&&li style=&box-sizing: border- padding: 0px 5&&51&/li&&li style=&box-sizing: border- padding: 0px 5&&52&/li&&li style=&box-sizing: border- padding: 0px 5&&53&/li&&li style=&box-sizing: border- padding: 0px 5&&54&/li&&li style=&box-sizing: border- padding: 0px 5&&55&/li&&li style=&box-sizing: border- padding: 0px 5&&56&/li&&li style=&box-sizing: border- padding: 0px 5&&57&/li&&li style=&box-sizing: border- padding: 0px 5&&58&/li&&li style=&box-sizing: border- padding: 0px 5&&59&/li&&li style=&box-sizing: border- padding: 0px 5&&60&/li&&li style=&box-sizing: border- padding: 0px 5&&61&/li&&li style=&box-sizing: border- padding: 0px 5&&62&/li&&li style=&box-sizing: border- padding: 0px 5&&63&/li&&li style=&box-sizing: border- padding: 0px 5&&64&/li&&li style=&box-sizing: border- padding: 0px 5&&65&/li&&li style=&box-sizing: border- padding: 0px 5&&66&/li&&li style=&box-sizing: border- padding: 0px 5&&67&/li&&li style=&box-sizing: border- padding: 0px 5&&68&/li&&li style=&box-sizing: border- padding: 0px 5&&69&/li&&li style=&box-sizing: border- padding: 0px 5&&70&/li&&li style=&box-sizing: border- padding: 0px 5&&71&/li&&li style=&box-sizing: border- padding: 0px 5&&72&/li&&li style=&box-sizing: border- padding: 0px 5&&73&/li&&li style=&box-sizing: border- padding: 0px 5&&74&/li&&li style=&box-sizing: border- padding: 0px 5&&75&/li&&li style=&box-sizing: border- padding: 0px 5&&76&/li&&li style=&box-sizing: border- padding: 0px 5&&77&/li&&li style=&box-sizing: border- padding: 0px 5&&78&/li&&li style=&box-sizing: border- padding: 0px 5&&79&/li&&li style=&box-sizing: border- padding: 0px 5&&80&/li&&li style=&box-sizing: border- padding: 0px 5&&81&/li&&/ul&
其关键代码就是在于设置:
&code class=&hljs glsl has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&mEffect = new DashPathEffect(new &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span&[]{&span class=&hljs-built_in& style=&color: rgb(102, 0, 102); box-sizing: border-&&length&/span&, &span class=&hljs-built_in& style=&color: rgb(102, 0, 102); box-sizing: border-&&length&/span&}, fraction * &span class=&hljs-built_in& style=&color: rgb(102, 0, 102); box-sizing: border-&&length&/span&);&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&/ul&
后面通过属性动画来控制路径绘制即可。
坐标与切线
PathMeasure的getPosTan()方法,可以获取路径上的坐标点和对应点的切线坐标,其中,路径上对应的点非常好理解,就是对应的点的坐标,而另一个参数tan[]数组,它用于返回当前点的运动轨迹的斜率,要理解这个API,我们首先来看下Math中的atan2这个方法:
&code class=&hljs cs has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&static&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&double&/span& &span class=&hljs-title& style=&box-sizing: border-&&atan2&/span& (&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&double&/span& y, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&double&/span& x)&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&/ul&
虽然atan()方法可以用于求一个反正切值,但是他传入的是一个角度,所以我们使用atan2()方法:
Math.atan2()函数返回点(x,y)和原点(0,0)之间直线的倾斜角
那么如何计算任意两点间直线的倾斜角呢?只需要将两点x,y坐标分别相减得到一个新的点(x2-x1,y2-y1)。然后利用它求出角度即可——Math.atan2(y2-y1,x2-x1)。
利用这个API,通常可以获取Path上的点坐标和点的运动趋势,对于运动趋势,通常通过Math.atan2()来转换为切线的角度,代码如下所示:
&code class=&hljs java has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&&span class=&hljs-annotation& style=&color: rgb(155, 133, 157); box-sizing: border-&&@Override&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&protected&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&onDraw&/span&(Canvas canvas) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&super&/span&.onDraw(canvas);
mMeasure.getPosTan(mMeasure.getLength() * currentValue, pos, tan);
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span& degrees = (&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span&) (Math.atan2(tan[&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1&/span&], tan[&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&]) * &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&180.0&/span& / Math.PI);
}&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&/ul&
根据这个API,我们可以模拟一个圆上的点和点的运动趋势,代码如下:
&code class=&hljs java has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-radius: 0 word-wrap: background:&&&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&package&/span& .pathart.
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.animation.ValueA
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.content.C
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.graphics.C
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.graphics.P
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.graphics.P
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.graphics.PathM
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.util.AttributeS
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&import&/span& android.view.V
&span class=&hljs-javadoc& style=&color: rgb(136, 0, 0); box-sizing: border-&&/**
* 曲线上切点
* Created by xuyisheng on 16/7/15.
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-class& style=&box-sizing: border-&&&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&class&/span& &span class=&hljs-title& style=&box-sizing: border- color: rgb(102, 0, 102);&&PathTan&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&extends&/span& &span class=&hljs-title& style=&box-sizing: border- color: rgb(102, 0, 102);&&View&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&implements&/span& &span class=&hljs-title& style=&box-sizing: border- color: rgb(102, 0, 102);&&View&/span&.&span class=&hljs-title& style=&box-sizing: border- color: rgb(102, 0, 102);&&OnClickListener&/span& {&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& Path mP
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span&[]
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span&[]
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& Paint mP
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span& currentValue = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&;
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& PathMeasure mM
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-title& style=&box-sizing: border-&&PathTan&/span&(Context context) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&super&/span&(context);
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-title& style=&box-sizing: border-&&PathTan&/span&(Context context, AttributeSet attrs) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&super&/span&(context, attrs);
mPath = &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& Path();
mPaint = &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& Paint();
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&4&/span&);
mMeasure = &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& PathMeasure();
mPath.addCircle(&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&, &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&, &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&200&/span&, Path.Direction.CW);
mMeasure.setPath(mPath, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&false&/span&);
pos = &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span&[&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&2&/span&];
tan = &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span&[&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&2&/span&];
setOnClickListener(&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&this&/span&);
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-title& style=&box-sizing: border-&&PathTan&/span&(Context context, AttributeSet attrs, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& defStyleAttr) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&super&/span&(context, attrs, defStyleAttr);
&span class=&hljs-annotation& style=&color: rgb(155, 133, 157); box-sizing: border-&&@Override&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&protected&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&onDraw&/span&(Canvas canvas) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&super&/span&.onDraw(canvas);
mMeasure.getPosTan(mMeasure.getLength() * currentValue, pos, tan);
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span& degrees = (&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span&) (Math.atan2(tan[&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1&/span&], tan[&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&]) * &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&180.0&/span& / Math.PI);
canvas.save();
canvas.translate(&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&400&/span&, &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&400&/span&);
canvas.drawPath(mPath, mPaint);
canvas.drawCircle(pos[&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&], pos[&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1&/span&], &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&10&/span&, mPaint);
canvas.rotate(degrees);
canvas.drawLine(&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&, -&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&200&/span&, &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&300&/span&, -&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&200&/span&, mPaint);
canvas.restore();
&span class=&hljs-annotation& style=&color: rgb(155, 133, 157); box-sizing: border-&&@Override&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&onClick&/span&(View view) {
ValueAnimator animator = ValueAnimator.ofFloat(&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&, &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1&/span&);
animator.addUpdateListener(&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& ValueAnimator.AnimatorUpdateListener() {
&span class=&hljs-annotation& style=&color: rgb(155, 133, 157); box-sizing: border-&&@Override&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&onAnimationUpdate&/span&(ValueAnimator valueAnimator) {
currentValue = (&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&float&/span&) valueAnimator.getAnimatedValue();
invalidate();
animator.setDuration(&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&3000&/span&);
animator.setRepeatCount(ValueAnimator.INFINITE);
animator.start();
&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&li style=&box-sizing: border- padding: 0px 5&&12&/li&&li style=&box-sizing: border- padding: 0px 5&&13&/li&&li style=&box-sizing: border- padding: 0px 5&&14&/li&&li style=&box-sizing: border- padding: 0px 5&&15&/li&&li style=&box-sizing: border- padding: 0px 5&&16&/li&&li style=&box-sizing: border- padding: 0px 5&&17&/li&&li style=&box-sizing: border- padding: 0px 5&&18&/li&&li style=&box-sizing: border- padding: 0px 5&&19&/li&&li style=&box-sizing: border- padding: 0px 5&&20&/li&&li style=&box-sizing: border- padding: 0px 5&&21&/li&&li style=&box-sizing: border- padding: 0px 5&&22&/li&&li style=&box-sizing: border- padding: 0px 5&&23&/li&&li style=&box-sizing: border- padding: 0px 5&&24&/li&&li style=&box-sizing: border- padding: 0px 5&&25&/li&&li style=&box-sizing: border- padding: 0px 5&&26&/li&&li style=&box-sizing: border- padding: 0px 5&&27&/li&&li style=&box-sizing: border- padding: 0px 5&&28&/li&&li style=&box-sizing: border- padding: 0px 5&&29&/li&&li style=&box-sizing: border- padding: 0px 5&&30&/li&&li style=&box-sizing: border- padding: 0px 5&&31&/li&&li style=&box-sizing: border- padding: 0px 5&&32&/li&&li style=&box-sizing: border- padding: 0px 5&&33&/li&&li style=&box-sizing: border- padding: 0px 5&&34&/li&&li style=&box-sizing: border- padding: 0px 5&&35&/li&&li style=&box-sizing: border- padding: 0px 5&&36&/li&&li style=&box-sizing: border- padding: 0px 5&&37&/li&&li style=&box-sizing: border- padding: 0px 5&&38&/li&&li style=&box-sizing: border- padding: 0px 5&&39&/li&&li style=&box-sizing: border- padding: 0px 5&&40&/li&&li style=&box-sizing: border- padding: 0px 5&&41&/li&&li style=&box-sizing: border- padding: 0px 5&&42&/li&&li style=&box-sizing: border- padding: 0px 5&&43&/li&&li style=&box-sizing: border- padding: 0px 5&&44&/li&&li style=&box-sizing: border- padding: 0px 5&&45&/li&&li style=&box-sizing: border- padding: 0px 5&&46&/li&&li style=&box-sizing: border- padding: 0px 5&&47&/li&&li style=&box-sizing: border- padding: 0px 5&&48&/li&&li style=&box-sizing: border- padding: 0px 5&&49&/li&&li style=&box-sizing: border- padding: 0px 5&&50&/li&&li style=&box-sizing: border- padding: 0px 5&&51&/li&&li style=&box-sizing: border- padding: 0px 5&&52&/li&&li style=&box-sizing: border- padding: 0px 5&&53&/li&&li style=&box-sizing: border- padding: 0px 5&&54&/li&&li style=&box-sizing: border- padding: 0px 5&&55&/li&&li style=&box-sizing: border- padding: 0px 5&&56&/li&&li style=&box-sizing: border- padding: 0px 5&&57&/li&&li style=&box-sizing: border- padding: 0px 5&&58&/li&&li style=&box-sizing: border- padding: 0px 5&&59&/li&&li style=&box-sizing: border- padding: 0px 5&&60&/li&&li style=&box-sizing: border- padding: 0px 5&&61&/li&&li style=&box-sizing: border- padding: 0px 5&&62&/li&&li style=&box-sizing: border- padding: 0px 5&&63&/li&&li style=&box-sizing: border- padding: 0px 5&&64&/li&&li style=&box-sizing: border- padding: 0px 5&&65&/li&&li style=&box-sizing: border- padding: 0px 5&&66&/li&&li style=&box-sizing: border- padding: 0px 5&&67&/li&&li style=&box-sizing: border- padding: 0px 5&&68&/li&&li style=&box-sizing: border- padding: 0px 5&&69&/li&&li style=&box-sizing: border- padding: 0px 5&&70&/li&&li style=&box-sizing: border- padding: 0px 5&&71&/li&&li style=&box-sizing: border- padding: 0px 5&&72&/li&&li style=&box-sizing: border- padding: 0px 5&&73&/li&&li style=&box-sizing: border- padding: 0px 5&&74&/li&&li style=&box-sizing: border- padding: 0px 5&&75&/li&&li style=&box-sizing: border- padding: 0px 5&&76&/li&&li style=&box-sizing: border- padding: 0px 5&&77&/li&&li style=&box-sizing: border- padding: 0px 5&&78&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&li style=&box-sizing: border- padding: 0px 5&&12&/li&&li style=&box-sizing: border- padding: 0px 5&&13&/li&&li style=&box-sizing: border- padding: 0px 5&&14&/li&&li style=&box-sizing: border- padding: 0px 5&&15&/li&&li style=&box-sizing: border- padding: 0px 5&&16&/li&&li style=&box-sizing: border- padding: 0px 5&&17&/li&&li style=&box-sizing: border- padding: 0px 5&&18&/li&&li style=&box-sizing: border- padding: 0px 5&&19&/li&&li style=&box-sizing: border- padding: 0px 5&&20&/li&&li style=&box-sizing: border- padding: 0px 5&&21&/li&&li style=&box-sizing: border- padding: 0px 5&&22&/li&&li style=&box-sizing: border- padding: 0px 5&&23&/li&&li style=&box-sizing: border- padding: 0px 5&&24&/li&&li style=&box-sizing: border- padding: 0px 5&&25&/li&&li style=&box-sizing: border- padding: 0px 5&&26&/li&&li style=&box-sizing: border- padding: 0px 5&&27&/li&&li style=&box-sizing: border- padding: 0px 5&&28&/li&&li style=&box-sizing: border- padding: 0px 5&&29&/li&&li style=&box-sizing: border- padding: 0px 5&&30&/li&&li style=&box-sizing: border- padding: 0px 5&&31&/li&&li style=&box-sizing: border- padding: 0px 5&&32&/li&&li style=&box-sizing: border- padding: 0px 5&&33&/li&&li style=&box-sizing: border- padding: 0px 5&&34&/li&&li style=&box-sizing: border- padding: 0px 5&&35&/li&&li style=&box-sizing: border- padding: 0px 5&&36&/li&&li style=&box-sizing: border- padding: 0px 5&&37&/li&&li style=&box-sizing: border- padding: 0px 5&&38&/li&&li style=&box-sizing: border- padding: 0px 5&&39&/li&&li style=&box-sizing: border- padding: 0px 5&&40&/li&&li style=&box-sizing: border- padding: 0px 5&&41&/li&&li style=&box-sizing: border- padding: 0px 5&&42&/li&&li style=&box-sizing: border- padding: 0px 5&&43&/li&&li style=&box-sizing: border- padding: 0px 5&&44&/li&&li style=&box-sizing: border- padding: 0px 5&&45&/li&&li style=&box-sizing: border- padding: 0px 5&&46&/li&&li style=&box-sizing: border- padding: 0px 5&&47&/li&&li style=&box-sizing: border- padding: 0px 5&&48&/li&&li style=&box-sizing: border- padding: 0px 5&&49&/li&&li style=&box-sizing: border- padding: 0px 5&&50&/li&&li style=&box-sizing: border- padding: 0px 5&&51&/li&&li style=&box-sizing: border- padding: 0px 5&&52&/li&&li style=&box-sizing: border- padding: 0px 5&&53&/li&&li style=&box-sizing: border- padding: 0px 5&&54&/li&&li style=&box-sizing: border- padding: 0px 5&&55&/li&&li style=&box-sizing: border- padding: 0px 5&&56&/li&&li style=&box-sizing: border- padding: 0px 5&&57&/li&&li style=&box-sizing: border- padding: 0px 5&&58&/li&&li style=&box-sizing: border- padding: 0px 5&&59&/li&&li style=&box-sizing: border- padding: 0px 5&&60&/li&&li style=&box-sizing: border- padding: 0px 5&&61&/li&&li style=&box-sizing: border- padding: 0px 5&&62&/li&&li style=&box-sizing: border- padding: 0px 5&&63&/li&&li style=&box-sizing: border- padding: 0px 5&&64&/li&&li style=&box-sizing: border- padding: 0px 5&&65&/li&&li style=&box-sizing: border- padding: 0px 5&&66&/li&&li style=&box-sizing: border- padding: 0px 5&&67&/li&&li style=&box-sizing: border- padding: 0px 5&&68&/li&&li style=&box-sizing: border- padding: 0px 5&&69&/li&&li style=&box-sizing: border- padding: 0px 5&&70&/li&&li style=&box-sizing: border- padding: 0px 5&&71&/li&&li style=&box-sizing: border- padding: 0px 5&&72&/li&&li style=&box-sizing: border- padding: 0px 5&&73&/li&&li style=&box-sizing: border- padding: 0px 5&&74&/li&&li style=&box-sizing: border- padding: 0px 5&&75&/li&&li style=&box-sizing: border- padding: 0px 5&&76&/li&&li style=&box-sizing: border- padding: 0px 5&&77&/li&&li style=&box-sizing: border- padding: 0px 5&&78&/li&&/ul&
Demo效果如图所示:
只不过这里在绘制的时候,使用了一些Trick,先通过canvas.translate方法将原点移动的圆心,同时,通过canvas.rotate将运动趋势的角度转换为画布的旋转,这样每次绘制切线,就只需要画一条同样的切线即可。
阅读排行榜}

我要回帖

更多关于 方舟生存进化显卡崩溃 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信