(点击上方公众号,可快速关注)
来源:伯乐在线专栏作者 -GcsSloop
链接:http://android.jobbole.com/83384/
接上文
第二类(Path)
方法预览:
// 第二类(Path)
// path
publicvoidaddPath(Pathsrc)
publicvoidaddPath(Pathsrc,floatdx,floatdy)
publicvoidaddPath(Pathsrc,Matrixmatrix)
这个相对比较简单,也很容易理解,就是将两个Path合并成为一个。
第三个方法是将src添加到当前path之前先使用Matrix进行变换。
第二个方法比第一个方法多出来的两个参数是将src进行了位移之后再添加进当前path中。
示例:
canvas.translate(mWidth/2,mHeight/2);// 移动坐标系到屏幕中心
canvas.scale(1,-1);//
Pathpath=newPath();
Pathsrc=newPath();
path.addRect(-200,-200,200,200,Path.Direction.CW);
src.addCircle(0,0,100,Path.Direction.CW);
path.addPath(src,0,200);
mPaint.setColor(Color.BLACK);// 绘制合并后的路径
canvas.drawPath(path,mPaint);
首先我们新建地方两个Path(矩形和圆形)中心都是坐标原点,我们在将包含圆形的path添加到包含矩形的path之前将其进行移动了一段距离,最终绘制出来的效果就如上面所示。
第三类(addArc与arcTo)
方法预览:
// 第三类(addArc与arcTo)
// addArc
publicvoidaddArc(RectFoval,floatstartAngle,floatsweepAngle)
// arcTo
publicvoidarcTo(RectFoval,floatstartAngle,floatsweepAngle)
publicvoidarcTo(RectFoval,floatstartAngle,floatsweepAngle,booleanforceMoveTo)
从名字就可以看出,这两个方法都是与圆弧相关的,作用都是添加一个圆弧到path中,但既然存在两个方法,两者之间肯定是有区别的:
名称
作用
区别
addArc
添加一个圆弧到path
直接添加一个圆弧到path中
arcTo
添加一个圆弧到path
添加一个圆弧到path,如果圆弧的起点和上次最后一个坐标点不相同,就连接两个点
可以看到addArc有1个方法(实际上是两个的,但另一个重载方法是API21添加的), 而arcTo有2个方法,其中一个最后多了一个布尔类型的变量forceMoveTo。
forceMoveTo是什么作用呢?
这个变量意思为“是否强制使用moveTo”,也就是说,是否使用moveTo将变量移动到圆弧的起点位移,也就意味着:
forceMoveTo
含义
等价方法
true
将最后一个点移动到圆弧起点,即不连接最后一个点与圆弧起点
public void addArc (RectF oval, float startAngle, float sweepAngle)
false
不移动,而是连接最后一个点与圆弧起点
public void arcTo (RectF oval, float startAngle, float sweepAngle)
示例(addArc):
canvas.translate(mWidth/2,mHeight/2);// 移动坐标系到屏幕中心
canvas.scale(1,-1);//
Pathpath=newPath();
path.lineTo(100,100);
RectFoval=newRectF(0,0,300,300);
path.addArc(oval,0,270);
// path.arcTo(oval,0,270,true); //
canvas.drawPath(path,mPaint);
示例(arcTo):
canvas.translate(mWidth/2,mHeight/2);// 移动坐标系到屏幕中心
canvas.scale(1,-1);//
Pathpath=newPath();
path.lineTo(100,100);
RectFoval=newRectF(0,0,300,300);
path.arcTo(oval,0,270);
// path.arcTo(oval,0,270,false); //
canvas.drawPath(path,mPaint);
从上面两张运行效果图可以清晰的看出来两者的区别,我就不再废话了。
第3组:isEmpty、 isRect、isConvex、 set 和 offset
这一组比较简单,稍微说一下就可以了。
isEmpty
方法预览:
publicbooleanisEmpty()
判断path中是否包含内容。
Pathpath=newPath();
Log.e("1",path.isEmpty()+"");
path.lineTo(100,100);
Log.e("2",path.isEmpty()+"");
log输出结果:
03-0214:22:54.77012379-12379/com.sloop.canvasE/1:true
03-0214:22:54.77012379-12379/com.sloop.canvasE/2:false
isRect
方法预览:
publicbooleanisRect(RectFrect)
判断path是否是一个矩形,如果是一个矩形的话,会将矩形的信息存放进参数rect中。
path.lineTo(0,400);
path.lineTo(400,400);
path.lineTo(400,0);
path.lineTo(0,0);
RectFrect=newRectF();
booleanb=path.isRect(rect);
Log.e("Rect","isRect:"+b+"| left:"+rect.left+"| top:"+rect.top+"| right:"+rect.right+"| bottom:"+rect.bottom);
log 输出结果:
03-0216:48:39.66924179-24179/com.sloop.canvasE/Rect:isRect:true|left:0.0|top:0.0|right:400.0|bottom:400.0
set
方法预览:
publicvoidset(Pathsrc)
将新的path赋值到现有path。
canvas.translate(mWidth/2,mHeight/2);// 移动坐标系到屏幕中心
canvas.scale(1,-1);//
Pathpath=newPath();// path添加一个矩形
path.addRect(-200,-200,200,200,Path.Direction.CW);
Pathsrc=newPath();// src添加一个圆
src.addCircle(0,0,100,Path.Direction.CW);
path.set(src);// 大致相当于 path = src;
canvas.drawPath(path,mPaint);
offset
方法预览:
publicvoidoffset(floatdx,floatdy)
publicvoidoffset(floatdx,floatdy,Pathdst)
这个的作用也很简单,就是对path进行一段平移,它和Canvas中的translate作用很像,但Canvas作用于整个画布,而path的offset只作用于当前path。
但是第二个方法最后怎么会有一个path作为参数?
其实第二个方法中最后的参数das是存储平移后的path的。
dst状态
效果
dst不为空
将当前path平移后的状态存入dst中,不会影响当前path
dat为空(null)
平移将作用于当前path,相当于第一种方法
示例:
canvas.translate(mWidth/2,mHeight/2);// 移动坐标系到屏幕中心
canvas.scale(1,-1);//
Pathpath=newPath();// path中添加一个圆形(圆心在坐标原点)
path.addCircle(0,0,100,Path.Direction.CW);
Pathdst=newPath();// dst中添加一个矩形
dst.addRect(-200,-200,200,200,Path.Direction.CW);
path.offset(300,0,dst);// 平移
canvas.drawPath(path,mPaint);// 绘制path
mPaint.setColor(Color.BLUE);// 更改画笔颜色
canvas.drawPath(dst,mPaint);// 绘制dst
从运行效果图可以看出,虽然我们在dst中添加了一个矩形,但是并没有表现出来,所以,当dst中存在内容时,dst中原有的内容会被清空,而存放平移后的path。
三.总结
本想一篇把path写完,但是万万没想到居然扯了这么多。本篇中讲解的是直线部分和一些常用方法,下一篇将着重讲解贝塞尔曲线和自相交图形渲染等相关问题,敬请期待哦。
学完本篇之后又解锁了新的境界,可以看看这位大神的文章 Android雷达图(蜘蛛网图)绘制
这个精小干练,非常适合新手练习使用,帮助大家更好的熟悉path的使用。
(,,• ₃ •,,)
参考资料
Path
Canvas
android绘图之Path总结
GcsSloop:搜索GcsSloop,发现更多精彩。
打赏支持作者写出更多好文章,谢谢!