android path平移,安卓自定义View进阶:Path基本操作(下)

(点击上方公众号,可快速关注)

来源:伯乐在线专栏作者 -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);

0818b9ca8b590ca3270a3433284dd417.png

首先我们新建地方两个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);

0818b9ca8b590ca3270a3433284dd417.png

示例(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);

0818b9ca8b590ca3270a3433284dd417.png

从上面两张运行效果图可以清晰的看出来两者的区别,我就不再废话了。

第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);

0818b9ca8b590ca3270a3433284dd417.png

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

0818b9ca8b590ca3270a3433284dd417.png

从运行效果图可以看出,虽然我们在dst中添加了一个矩形,但是并没有表现出来,所以,当dst中存在内容时,dst中原有的内容会被清空,而存放平移后的path。

三.总结

本想一篇把path写完,但是万万没想到居然扯了这么多。本篇中讲解的是直线部分和一些常用方法,下一篇将着重讲解贝塞尔曲线和自相交图形渲染等相关问题,敬请期待哦。

学完本篇之后又解锁了新的境界,可以看看这位大神的文章 Android雷达图(蜘蛛网图)绘制

0818b9ca8b590ca3270a3433284dd417.png

这个精小干练,非常适合新手练习使用,帮助大家更好的熟悉path的使用。

(,,• ₃ •,,)

参考资料

Path

Canvas

android绘图之Path总结

GcsSloop:搜索GcsSloop,发现更多精彩。

0818b9ca8b590ca3270a3433284dd417.png

打赏支持作者写出更多好文章,谢谢!

0818b9ca8b590ca3270a3433284dd417.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值