第1組: moveTo、 setLastPoint必孤、 lineTo 和 close
畫筆
Paint mPaint = new Paint(); // 創(chuàng)建畫筆
mPaint.setColor(Color.BLACK); // 畫筆顏色 - 黑色
mPaint.setStyle(Paint.Style.STROKE); // 填充模式 - 描邊
mPaint.setStrokeWidth(10); // 邊框寬度 - 10
lineTo
方法
public void lineTo (float x, float y)
示例
canvas.translate(mWidth / 2, mHeight / 2); // 移動坐標系到屏幕中心(寬高數(shù)據(jù)在onSizeChanged中獲取)
Path path = new Path(); // 創(chuàng)建Path
path.lineTo(200, 200); // lineTo
path.lineTo(200,0);
canvas.drawPath(path, mPaint); // 繪制Path
lineTo的默認點為坐標原點。
moveTo 和 setLastPoint
區(qū)別
方法名 |
簡介 |
是否影響之前的操作 |
是否影響之后操作 |
moveTo |
移動下一次操作的起點位置 |
否 |
是 |
setLastPoint |
設置之前操作的最后一個點位置 |
是 |
是 |
方法
// moveTo
public void moveTo (float x, float y)
// setLastPoint
public void setLastPoint (float dx, float dy)
moveTo示例
canvas.translate(mWidth / 2, mHeight / 2); // 移動坐標系到屏幕中心
Path path = new Path(); // 創(chuàng)建Path
path.lineTo(200, 200); // lineTo
path.moveTo(200,100); // moveTo
path.lineTo(200,0); // lineTo
canvas.drawPath(path, mPaint); // 繪制Path
setLastPoint示例
canvas.translate(mWidth / 2, mHeight / 2); // 移動坐標系到屏幕中心
Path path = new Path(); // 創(chuàng)建Path
path.lineTo(200, 200); // lineTo
path.setLastPoint(200,100); // setLastPoint
path.lineTo(200,0); // lineTo
canvas.drawPath(path, mPaint); // 繪制Path
close
方法
public void close ()
示例
canvas.translate(mWidth / 2, mHeight / 2); // 移動坐標系到屏幕中心
Path path = new Path(); // 創(chuàng)建Path
path.lineTo(200, 200); // lineTo
path.lineTo(200,0); // lineTo
path.close(); // close
canvas.drawPath(path, mPaint); // 繪制Path
第2組: add*與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 |
clockwise |
順時針 |
CCW |
counter-clockwise |
逆時針 |
作用
序號 |
作用 |
1 |
在添加圖形時確定閉合順序(各個點的記錄順序) |
2 |
對圖形的渲染結果有影響(是判斷圖形渲染的重要條件) |
矩形示例
canvas.translate(mWidth / 2, mHeight / 2); // 移動坐標系到屏幕中心
Path path = new Path();
path.addRect(-200,-200,200,200, Path.Direction.CW);
canvas.drawPath(path,mPaint);
其中Path.Direction影響的是點的繪制順序瑞躺,平常無區(qū)別敷搪,但是對于進行setLastPoint這些 點順序會影響結果的操作會顯示出區(qū)別。
第二類(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)
第三類(addArc與arcTo)
方法
// addArc
public void addArc (RectF oval, float startAngle, float sweepAngle)
// arcTo
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 <= sweepAngle <360) |
forceMoveTo |
是否強制使用MoveTo |
forceMoveTo |
含義 |
等價方法 |
true |
將最后一個點移動到圓弧起點嘱么,即不連接最后一個點與圓弧起點 |
public void addArc (RectF oval, float startAngle, float sweepAngle) |
false |
不移動狮含,而是連接最后一個點與圓弧起點 |
public void arcTo (RectF oval, float startAngle, float sweepAngle) |
sweepAngle取值范圍是 [-360, 360)顽悼,不包括360曼振,當 >= 360 或者 < -360 時將不會繪制任何內容, 對于360蔚龙,你可以用一個接近的值替代冰评,例如: 359.99。
區(qū)別
名稱 |
作用 |
區(qū)別 |
addArc |
添加一個圓弧到path |
直接添加一個圓弧到path中 |
arcTo |
添加一個圓弧到path |
添加一個圓弧到path木羹,如果圓弧的起點和上次最后一個坐標點不相同甲雅,就連接兩個點 |
示例(addArc)
canvas.translate(mWidth / 2, mHeight / 2); // 移動坐標系到屏幕中心
canvas.scale(1,-1); // <-- 注意 翻轉y坐標軸
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); // 移動坐標系到屏幕中心
canvas.scale(1,-1); // <-- 注意 翻轉y坐標軸
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組:isEmpty解孙、 isRect、isConvex抛人、 set 和 offset
isEmpty
// 判斷path中是否包含內容
public boolean isEmpty ()
isRect
方法
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);
Log.e("Rect","isRect:"+b+"| left:"+rect.left+"| top:"+rect.top+"| right:"+rect.right+"| bottom:"+rect.bottom);
set
方法
// 將新的path賦值到現(xiàn)有path
public void set (Path src)
offset
// 對path進行一段平移弛姜,它和Canvas中的translate作用很像,但Canvas作用于整個畫布妖枚,而path的offset只作用于當前path
public void offset (float dx, float dy)
public void offset (float dx, float dy, Path dst)
dst狀態(tài) |
效果 |
dst不為空 |
將當前path平移后的狀態(tài)存入dst中廷臼,不會影響當前path |
dst為空(null) |
平移將作用于當前path,相當于第一種方法 |
第4組:r*方法
r*方法的坐標使用的是相對位置(基于當前點的位移)绝页,而之前方法的坐標是絕對位置(基于當前坐標系的坐標)荠商。
Path path = new Path();
path.moveTo(100,100);
path.rLineTo(100,200);
canvas.drawPath(path,mDeafultPaint);