Android Path详解

本文主要介绍了Android中Path内部类,包括Path.Direction(逆时针和顺时针创建路径)、Path.FillType和Path.Op。还详细阐述了Path的绘制方法,如矩形、椭圆、圆角矩形、圆形、弧形和直线路径的绘制,给出了相应的方法及参数说明。

Path内部类

Path.Direction

  • Path.Direction.CCW:counter-clockwise的缩写,逆时针创建路径。
  • Path.Direction.CW:clockwise的缩写,顺时针创建路径。

Path.FillType

Path.Op

Path的绘制

1.矩形路径

  • addRect(float left, float top, float right, float bottom, Path.Direction dir)
  • addRect(RectF rect, Path.Direction dir)
Path pathRect1 = new Path();
RectF rectFRect1 = new RectF(50, 200 + paddingTop, 500, 400);
pathRect1.addRect(rectFRect1, Path.Direction.CCW);

mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(5);
canvas.drawPath(pathRect1, mPaint);

2.椭圆路径

  • addOval(RectF oval, Path.Direction dir)
  • addOval(float left, float top, float right, float bottom, Direction dir)
Path pathOval = new Path();
RectF rectFOval1 = new RectF(50, 600 + paddingTop, 500, 800);
pathOval.addOval(rectFOval1, Path.Direction.CW);

mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(5);
canvas.drawPath(pathOval, mPaint);

3.圆角矩形路径

  • addRoundRect(RectF rect, float[] radii, Path.Direction dir)
  • addRoundRect(float left, float top, float right, float bottom, float[] radii,Direction dir)
  • addRoundRect(RectF rect, float rx, float ry, Path.Direction dir)
  • addRoundRect(float left, float top, float right, float bottom, float rx, float ry,Direction dir)
//统一圆角
Path pathRoundRect1 = new Path();
RectF rectFRoundRect = new RectF(50, 1000 + paddingTop, 500, 1200);
pathRoundRect1.addRoundRect(rectFRoundRect,50,50,Path.Direction.CW);
        
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(5);
canvas.drawPath(pathRoundRect1, mPaint);
drawRightDescr(canvas, 1100 + paddingTop, "统一四角,addRoundRect");

//四角自定义
Path pathRoundRect2 = new Path();
RectF rectFRoundRect2 = new RectF(50, 1200 + paddingTop, 500, 1400);
float[] radii={0,0,50,50,0,0,50,50};
pathRoundRect2.addRoundRect(rectFRoundRect2,radii,Path.Direction.CW);

mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(5);
canvas.drawPath(pathRoundRect2, mPaint);

4.圆形路径

  • addCircle(float x, float y, float radius, Path.Direction dir)
    • x:圆心点X轴坐标。
    • y:圆心点Y轴坐标。
    • radius:半径。
    • Path.Direction:绘制方向。
Path pathCircle = new Path();
pathCircle.addCircle(250,1700,100,Path.Direction.CW);

mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(5);
canvas.drawPath(pathCircle, mPaint);

5.弧形路径

  • addArc(RectF oval, float startAngle, float sweepAngle)
Path pathArc = new Path();
RectF rectFArc = new RectF(50,2000+paddingTop,500,2200);
pathArc.addArc(rectFArc,0,120);

mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(5);
canvas.drawPath(pathArc, mPaint);

6.直线路径

  • moveTo(float x, float y):设置下一个轮廓线的起点为点(x,y)。
  • lineTo(float x, float y):从最后一个点到指定的点(x,y)添加新的一行。如果在此之前没有调用过moveTo()设置起点,则自动将起点设置为(0,0)。
  • close():关闭当前轮廓线。如果当前点不等于轮廓线的第一个点,则自动添加线段。
//不闭合
Path pathLines1 = new Path();
pathLines1.moveTo(250,2400+paddingTop);
pathLines1.lineTo(50,2600);
pathLines1.lineTo(450,2600);

mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(5);
canvas.drawPath(pathLines1,mPaint);

//闭合
Path pathLines2 = new Path();
pathLines2.moveTo(250,2600+paddingTop);
pathLines2.lineTo(50,2800);
pathLines2.lineTo(450,2800);
pathLines2.close();

mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(5);
canvas.drawPath(pathLines2,mPaint);

//五角星闭合
Path pathLines3 = new Path();
pathLines3.moveTo(250,2800+paddingTop);
pathLines3.lineTo(100,3000);
pathLines3.lineTo(400,2900);
pathLines3.lineTo(100,2900);
pathLines3.lineTo(100,2900);
pathLines3.lineTo(400,3000);
pathLines3.close();

mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(5);
canvas.drawPath(pathLines3,mPaint);        

作者:Brainbg(白雨)
GitHub:https://github.com/Brainbg
博客:https://www.brainbg.com/
简书:https://www.jianshu.com/u/94518ede7100
优快云:https://blog.youkuaiyun.com/u014720022

### 使用 Android Canvas 绘制 Path 的详细解释 #### 创建 Path 对象 为了在 `Canvas` 上绘制路径 (`Path`),首先需要创建一个 `Path` 实例。此对象允许定义复杂的形状和线条。 ```java Path path = new Path(); ``` #### 定义路径数据 通过调用 `Path` 类的方法来构建想要绘制的具体路径。常用方法有: - `moveTo(float x, float y)`:移动到指定位置而不画线。 - `lineTo(float x, float y)`:从当前点向给定坐标绘制直线并更新当前位置。 - `quadTo(float x1, float y1, float x2, float y2)` 或者 `rQuadTo()` :用于添加二次贝塞尔曲线段。 - `cubicTo(float x1, float y1, float x2, float y2, float x3, float y3)` 或者 `rCubicTo()` : 添加三次方程控制的贝塞尔曲线段。 - `close()`:闭合子路径,即连接起点与终点形成封闭区域[^1]。 #### 设置 Paint 属性 为了让绘图效果更加美观,在实际绘制之前还需要配置好 `Paint` 对象的相关属性,如颜色、宽度以及样式等。 ```java Paint paint = new Paint(); paint.setColor(Color.BLUE); paint.setStrokeWidth(5f); paint.setStyle(Paint.Style.STROKE); // 可选 STROKE/FILL/STROKE_AND_FILL ``` #### 执行绘制命令 最后一步是在重写的 `onDraw(Canvas canvas)` 方法内利用上述准备好的 `Path` 和 `Paint` 来完成具体的绘制工作。 ```java @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 开始定义path path.moveTo(50, 50); path.lineTo(150, 50); path.quadTo(200, 0, 250, 50); path.cubicTo(300, 100, 400, -50, 500, 50); // 调用canvas.drawPath()函数进行绘制 canvas.drawPath(path, paint); } ``` 以上代码片段展示了如何使用基本几何变换组合成复杂图形,并将其呈现在屏幕上。值得注意的是所有的这些操作最终都会被转换为 OpenGL ES 命令并通过 GPU 加速处理以提高效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值