資料鏈接
1.GcsSloop的自定義系列
一、Path基本操作
1.Path常用方法表
作用 | 相關方法 | 備注
----|------
移動起點 | moveTo | 移動下一次操作的起點位置
設置終點 | setLastPoint | 重置當前path中最后一個點位置,如果在繪制之前調用,效果和moveTo相同
連接直線 | lineTo | 添加上一個點到當前點之間的直線到Path
閉合路徑 | close | 連接第一個點連接到最后一個點,形成一個閉合區(qū)域
添加內容 | addRect,
addRoundRect,
addOval,
addCircle,
addPath,
addArc,
arcTo | 添加(矩形,
圓角矩形,
橢圓,
圓,
路徑,
圓弧)
到當前Path (注意addArc和arcTo的區(qū)別)
是否為空 | isEmpty | 判斷Path是否為空
是否為矩形 | isRect | 判斷path是否是一個矩形
替換路徑 | set | 用新的路徑替換到當前路徑所有內容
偏移路徑 | offset | 對當前路徑之前的操作進行偏移(不會影響之后的操作)
貝塞爾曲線 | quadTo,
cubicTo | 二次
三次貝塞爾曲線的方法
rXxx方法 | rMoveTo,
rLineTo,
rQuadTo,
rCubicTo | 不帶r的方法是基于原點的坐標系(偏移量),
rXxx方法是基于當前點坐標系(偏移量)
填充模式 | setFillType,
getFillType,
isInverseFillType,
toggleInverseFillType | 設置,
獲取,
判斷,
切換填充模式
提示方法 | incReserve | 提示Path還有多少個點等待加入(這個方法貌似會讓Path優(yōu)化存儲結構)
布爾操作(API19) | op | 對兩個Path進行布爾運算(即取交集、并集等操作)
計算邊界 | computeBounds | 計算Path的邊界
重置路徑 | reset,
rewind | 清除Path中的內容
reset不保留內部數(shù)據(jù)結構,但會保留FillType.
rewind會保留內部的數(shù)據(jù)結構,但不保留FillType
矩陣操作 | transform | 矩陣變換
2.Path介紹
2.1.Path作用
Path不僅能夠繪制簡單圖形,也可以繪制這些比較復雜的圖形。另外,根據(jù)路徑繪制文本和剪裁畫布都會用到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)
參數(shù):
| 參數(shù) | 摘要 |
|---|---|
| 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是否是一個矩形,包含則將矩形的信息存放進參數(shù)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賦值到現(xiàn)有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平移后的狀態(tài)存入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