android path + fillType

本文详细介绍了Android中Path的基本绘图方法,包括addArc、addCircle等,并解析了Path的fillType填充模式,如非零环绕数规则和奇偶规则。此外,还探讨了Path.op方法的组合运算,如DIFFERENCE、INTERSECT等,并区分了addArc与arcTo、reset与rewind等易混淆的方法。最后,解释了Path的close、offset等其它常用方法及其作用。
摘要由CSDN通过智能技术生成

Path作为Android中一种相对复杂的绘图方式,官方文档中的有些解释并不是很好理解,这里作一个相对全面一些的总结,供日后查看,也分享给大家,共同进步。

1.基本绘图方法

  1. addArc(RectF oval, float startAngle, float sweepAngle)
    绘制弧线,配合Paint的Style可以实现不同的填充效果
  2. addCircle(float x, float y, float radius, Path.Direction dir)
    绘制圆形,其中第dir参数用来指定绘制时是顺时针还是逆时针
  3. addOval(RectF oval, Path.Direction dir)
    绘制椭圆形,其中 oval作为椭圆的外切矩形区域
  4. addRect(RectF rect, Path.Direction dir)
    绘制矩形
  5. addRoundRect(RectF rect, float rx, float ry, Path.Direction dir)
    绘制圆角矩形
  6. lineTo(float x, float y)
    绘制直线
  7. addPath(Path src)
    添加一个新的Path到当前Path
  8. arcTo(RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo)
    addArc方法相似,但也有区别,下文细述。
  9. quadTo(float x1, float y1, float x2, float y2)
    绘制二次贝塞尔曲线,其中 (x1,y1)为控制点,(x2,y2)为终点
  10. cubicTo(float x1, float y1, float x2, float y2, float x3, float y3)
    绘制三次贝塞尔曲线,其中(x1,y1),(x2,y2)为控制点,(x3,y3)为终点

2.rXXX方法

上面的lineTo,MoveTo,QuadTo,CubicTo方法都有与之对应的rXXX方法:

  1. rLineTo(float dx, float dy)
  2. rMoveTo(float dx, float dy)
  3. rQuadTo(float dx1, float dy1, float dx2, float dy2)
  4. rCubicTo(float x1, float y1, float x2, float y2, float x3, float y3)

这些方法与之对应的原方法相比,惟一的区别在于:r方法是基于当前绘制开始点的offest,比如当前paint位于 (100,100)处,则使用rLineTo(100,100)方法绘制出来的直线是从(100,100)到(200,200)的一条直接,由此可见rXXX方法方便用来基于之前的绘制作连续绘制。

3.Path.op方法

1
2
3
4
//原型
op(Path path, Path.Op op)
//eg
path1.op(path2,Path.Op.DIFFERENCE);

此方法用于对两个Path对象做相应的运算组合(combine),具体的说是根据不同的op参数及path2参数来影响path1对象,有点类似于数学上的集合运算。请看下面的例子:

1
2
3
4
5
6
Path path1 = new Path();
path1.addCircle(150, 
当然可以使用`Path`来实现这种左右半圆的矩形效果。`Path`是Android绘图API中的核心组件,它可以用来构建复杂的图形路径。 以下是使用`Path`实现的例子: ```java public class HalfCircleRectangleView extends View { private Path path; private Paint paint; public HalfCircleRectangleView(Context context) { super(context); init(); } //... private void init() { paint = new Paint(); paint.setStyle(Paint.Style.FILL); paint.setStrokeWidth(2); // 设置线条宽度,如果你想要矩形边缘有边框 path = new Path(); path.setFillType(Path.FillType.EVEN_ODD); // 用于非封闭路径的填充规则 } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); float radius = getMeasuredWidth() / 4; float x = getPaddingLeft(); float y = getPaddingTop(); // 左侧半圆 path.moveTo(x + radius, y); path.lineTo(x, y + radius); path.arcTo(new RectF(x, y + radius, x, getMeasuredHeight()), 180, 90); path.lineTo(x, getMeasuredHeight() - y); path.arcTo(new RectF(x, getMeasuredHeight() - y, x + radius, getMeasuredHeight()), 270, 90); path.close(); // 关闭路径 // 右侧半圆类似地绘制 path.reset(); // 清除之前的路径 path.moveTo(getMeasuredWidth() - x - radius, y); path.lineTo(getMeasuredWidth() - x, y + radius); path.arcTo(new RectF(getMeasuredWidth() - x, y + radius, getMeasuredWidth() - x, getMeasuredHeight()), 0, 90); path.lineTo(getMeasuredWidth() - x, getMeasuredHeight() - y); path.arcTo(new RectF(getMeasuredWidth() - x, getMeasuredHeight() - y, getMeasuredWidth() - x - radius, getMeasuredHeight()), 90, 90); path.close(); canvas.clipPath(path, Region.Op.INTERSECT); // 仅绘制剪裁后的部分 canvas.drawPath(path, paint); } } ``` 在这个例子中,我们创建了一个`Path`对象,并分别为左半圆和右半圆构造了两条独立的路径。最后,我们在`onDraw`方法中先将画布剪裁为路径的一部分,然后绘制填充颜色的`Path`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值