自定义View-Path⑤ 笔

资料链接
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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,888评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,677评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,386评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,726评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,729评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,337评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,902评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,807评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,349评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,439评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,567评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,242评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,933评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,420评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,531评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,995评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,585评论 2 359

推荐阅读更多精彩内容