自定義View-Path⑤ 筆

資料鏈接
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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容