美文网首页
自定义View-Path⑤ 笔

自定义View-Path⑤ 笔

作者: Demon鑫 | 来源:发表于2017-06-07 17:20 被阅读0次

资料链接
1.GcsSloop的自定义系列

一、Path基本操作

1.Path常用方法表

作用 | 相关方法 | 备注
----|------
移动起点 | moveTo | 移动下一次操作的起点位置
设置终点 | setLastPoint | 重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同
连接直线 | lineTo | 添加上一个点到当前点之间的直线到Path
闭合路径 | close | 连接第一个点连接到最后一个点,形成一个闭合区域
添加内容 | addRect,
addRoundRect,
addOval,
addCircle,
addPath,
addArc,
arcTo | 添加(矩形,
圆角矩形,
椭圆,
圆,
路径,
圆弧)
到当前Path (注意addArc和arcTo的区别)
是否为空 | isEmpty | 判断Path是否为空
是否为矩形 | isRect | 判断path是否是一个矩形
替换路径 | set | 用新的路径替换到当前路径所有内容
偏移路径 | offset | 对当前路径之前的操作进行偏移(不会影响之后的操作)
贝塞尔曲线 | quadTo,
cubicTo | 二次
三次贝塞尔曲线的方法
rXxx方法 | rMoveTo,
rLineTo,
rQuadTo,
rCubicTo | 不带r的方法是基于原点的坐标系(偏移量),
rXxx方法是基于当前点坐标系(偏移量)
填充模式 | setFillType,
getFillType,
isInverseFillType,
toggleInverseFillType | 设置,
获取,
判断,
切换填充模式
提示方法 | incReserve | 提示Path还有多少个点等待加入(这个方法貌似会让Path优化存储结构)
布尔操作(API19) | op | 对两个Path进行布尔运算(即取交集、并集等操作)
计算边界 | computeBounds | 计算Path的边界
重置路径 | reset,
rewind | 清除Path中的内容
reset不保留内部数据结构,但会保留FillType.
rewind会保留内部的数据结构,但不保留FillType
矩阵操作 | transform | 矩阵变换

2.Path介绍

2.1.Path作用

Path不仅能够绘制简单图形,也可以绘制这些比较复杂的图形。另外,根据路径绘制文本和剪裁画布都会用到Path。

2.2.Path路径

  • 封闭路径
  • 开放路径

2.3.Path原理

Path是封装了由直线和曲线(二次,三次贝塞尔曲线)构成的几何路径。

3.Path方法详解

3.1:moveTo、setLastPoint、lineTo、close

lineTo:线
public void lineTo (float x, float y)

例:

// 移动坐标系到屏幕中心
canvas.translate(mWidth / 2, mHeight / 2);

Path path = new Path();
path.lineTo(200, 200);
path.lineTo(200, 0);
// 绘制Path
canvas.drawPath(path, mPaint);
moveTo:移动下一次操作的起点位置。

对之前操作无影响,对之后操作有影响。

// moveTo
public void moveTo (float x, float y)

例:

// 移动坐标系到屏幕中心
canvas.translate(mWidth / 2, mHeight / 2);
Path path = new Path();
path.lineTo(200, 200);
// 移动下一个起始点。对之前操作无影响
path.moveTo(200, 100);
path.lineTo(200, 0);
// 绘制Path
canvas.drawPath(path, mPaint);
setLastPoint:设置之前操作的最后一个点位置。

对之前操作有影响,对之后操作有影响。

// setLastPoint
public void setLastPoint (float dx, float dy)

例:

// 移动坐标系到屏幕中心
canvas.translate(mWidth / 2, mHeight / 2);
Path path = new Path();
path.lineTo(200, 200);
// 设置之前操作的最后一个点位置。对之前操作有影响
path.setLastPoint(200, 100);
path.lineTo(200, 0);
// 绘制Path
canvas.drawPath(path, mPaint);
close:连接起始点与终止点,形成封闭的图形。
// close
public void close ()

例:

// 移动坐标系到屏幕中心
canvas.translate(mWidth / 2, mHeight / 2);
Path path = new Path();
path.lineTo(200, 200);
path.lineTo(200, 0);
// 连接起始点与终止点,封闭路径。
path.close();
// 绘制Path
canvas.drawPath(path, mPaint);

3.2:addXxx与arcTo

第一类(基本形状)
// 圆形
public void addCircle (float x, float y, float radius, Path.Direction dir)
// 椭圆
public void addOval (RectF oval, Path.Direction dir)
// 矩形
public void addRect (float left, float top, float right, float bottom, Path.Direction dir)
public void addRect (RectF rect, Path.Direction dir)
// 圆角矩形
public void addRoundRect (RectF rect, float[] radii, Path.Direction dir)
public void addRoundRect (RectF rect, float rx, float ry, Path.Direction dir)

Path.Direction:方向。CW-顺时针,CCW-逆时针

顺时针案例:

canvas.translate(mWidth / 2, mHeight / 2);
Path path = new Path();
path.addRect(-200, -200, 200, 200, Path.Direction.CW);
// 重置最后一个点的位置
path.setLastPoint(-300, 300);
canvas.drawPath(path, mPaint);

逆时针案例:

canvas.translate(mWidth / 2, mHeight / 2);
Path path = new Path();
path.addRect(-200, -200, 200, 200, Path.Direction.CCW);
// 重置最后一个点的位置
path.setLastPoint(-300, 300);
canvas.drawPath(path, mPaint);
第二类(addPath)
// 将两个Path合并成为一个
public void addPath (Path src)
// 将src进行了位移之后再添加进当前path中
public void addPath (Path src, float dx, float dy)
// 将src添加到当前path之前先使用Matrix进行变换
public void addPath (Path src, Matrix matrix)

例:

// 移动坐标系到屏幕中心
canvas.translate(mWidth / 2, mHeight / 2);
// 翻转y坐标轴
canvas.scale(1, -1);
Path path = new Path();
Path src = new Path();
path.addRect(-200, -200, 200, 200, Path.Direction.CW);
src.addCircle(0, 0, 100, Path.Direction.CW);
path.addPath(src, 0, 200);
// 绘制合并后的路径
canvas.drawPath(path, mPaint);
第三类(addArc与arcTo)
// addArc:直接添加一个圆弧到path中
public void addArc (RectF oval, float startAngle, float sweepAngle)
// arcTo:添加一个圆弧到path,如果圆弧的起点和上次最后一个坐标点不相同,就连接两个点
public void arcTo (RectF oval, float startAngle, float sweepAngle)
public void arcTo (RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo)

参数:

参数 摘要
oval 圆弧的外切矩形。
startAngle 开始角度
sweepAngle 扫过角度 [-360, 360)
forceMoveTo 是否强制使用MoveTo将变量移动到圆弧的起点位移

例 addArc:

// 移动坐标系到屏幕中心
canvas.translate(mWidth / 2, mHeight / 2);
// 翻转y坐标轴
canvas.scale(1, -1);
Path path = new Path();
path.lineTo(100, 100);
RectF oval = new RectF(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);
// 翻转y坐标轴
canvas.scale(1, -1);
Path path = new Path();
path.lineTo(100, 100);
RectF oval = new RectF(0, 0, 300, 300);
path.arcTo(oval, 0, 270);
// 和上一句作用等价
// path.arcTo(oval, 0, 270, false);
canvas.drawPath(path, mPaint);

3.3:isEmpty、isRect、isConvex、set、offset

isEmpty(判断path中是否包含内容)
public boolean isEmpty ()
isRect(判断path是否是一个矩形,包含则将矩形的信息存放进参数rect中)
public boolean isRect (RectF rect)

path.lineTo(0, 400);
path.lineTo(400, 400);
path.lineTo(400, 0);
path.lineTo(0, 0);

RectF rect = new RectF();
boolean b = path.isRect(rect);
set(将新的path赋值到现有path)
public void set (Path src)
offset(对path进行一段平移)
public void offset (float dx, float dy)
// das存储平移后的path
public void offset (float dx, float dy, Path dst)

dst:

  • 不为空时,将当前path平移后的状态存入dst中,不会影响当前path。
  • 为空时,平移将作用于当前path。

例:

// 移动坐标系到屏幕中心
canvas.translate(mWidth / 2, mHeight / 2);
// 翻转y坐标轴
canvas.scale(1, -1);
// path中添加一个圆形(圆心在坐标原点)
Path path = new Path();
path.addCircle(0, 0, 100, Path.Direction.CW);
// dst中添加一个矩形
Path dst = new Path();
dst.addRect(-200, -200, 200, 200, Path.Direction.CW);
// 平移
path.offset(300, 0, dst);
// 绘制path
canvas.drawPath(path, mPaint);
// 更改画笔颜色
mPaint.setColor(Color.BLUE);
// 绘制dst
canvas.drawPath(dst, mPaint);

2017/6/7 17:13:34

相关文章

网友评论

      本文标题:自定义View-Path⑤ 笔

      本文链接:https://www.haomeiwen.com/subject/qwrafxtx.html