Path做爲Android中一種相對複雜的繪圖方式,官方文檔中的有些解釋並非很好理解,這裏做一個相對全面一些的總結,供往後查看,也分享給你們,共同進步。java
dir
參數用來指定繪製時是順時針仍是逆時針oval
做爲橢圓的外切矩形區域addArc
方法類似,但也有區別,下文細述。二次貝塞爾曲線
,其中 (x1,y1)爲控制點,(x2,y2)爲終點三次貝塞爾曲線
,其中(x1,y1),(x2,y2)爲控制點,(x3,y3)爲終點上面的lineTo,MoveTo,QuadTo,CubicTo方法都有與之對應的rXXX
方法:算法
這些方法與之對應的原方法相比,唯一的區別在於:r方法是基於當前繪製開始點的offest,好比當前paint位於 (100,100)處,則使用rLineTo(100,100)
方法繪製出來的直線是從(100,100)到(200,200)的一條直接,因而可知rXXX
方法方便用來基於以前的繪製做連續繪製。canvas
//原型
op(Path path, Path.Op op) //eg path1.op(path2,Path.Op.DIFFERENCE);
此方法用於對兩個Path對象作相應的運算組合(combine),具體的說是根據不一樣的op
參數及path2參數來影響path1對象,有點相似於數學上的集合運算。請看下面的例子:swift
Path path1 = new Path();
path1.addCircle(150, 150, 100, Path.Direction.CW); Path path2 = new Path(); path2.addCircle(200, 200, 100, Path.Direction.CW); path1.op(path2, Path.Op.DIFFERENCE); canvas.drawPath(path1, paint1);
效果以下:
數據結構
經過不斷修改path1.op的第二個參數依次能夠獲得以下效果:ide
Path.Op.INTERSECT
效果:
動畫
Path.Op.UNION
效果:
ui
Path.Op.REVERSE_DIFFERENCE
效果:spa
Path.Op.XOR
效果:rest
設置path的填充模式.網上關於path的FillType的介紹不多,實際上在官方ApiDemos
裏就有個很好的例子:
/**
* Created by ghui on 10/25/15.
*/
public class PathFillTypeView extends View { private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private Path mPath; public PathFillTypeView(Context context) { super(context); setFocusable(true); setFocusableInTouchMode(true); mPath = new Path(); mPath.addCircle(40, 40, 45, Path.Direction.CCW); mPath.addCircle(80, 80, 45, Path.Direction.CCW); mPath.addCircle(120, 120, 45, Path.Direction.CCW); } private void showPath(Canvas canvas, int x, int y, Path.FillType ft, Paint paint) { canvas.save(); canvas.translate(x, y); canvas.clipRect(0, 0, 160, 160); canvas.drawColor(Color.WHITE); mPath.setFillType(ft); canvas.drawPath(mPath, paint); canvas.restore(); } @Override protected void onDraw(Canvas canvas) { Paint paint = mPaint; paint.setColor(Color.RED); canvas.drawColor(0xFFCCCCCC); canvas.translate(20, 20); paint.setAntiAlias(true); showPath(canvas, 0, 0, Path.FillType.WINDING, paint); showPath(canvas, 160 * 2, 0, Path.FillType.EVEN_ODD, paint); showPath(canvas, 0, 160 * 2, Path.FillType.INVERSE_WINDING, paint); showPath(canvas, 160 * 2, 160 * 2, Path.FillType.INVERSE_EVEN_ODD, paint); } }
效果以下:
(上面的例子在官方ApiDemo的基礎上作了適當的修改)
所謂填充指的就是填充內部,setFillType
就是用來界定哪裏算內部的算法。在計算機圖形學中界定一個點是否是在多邊形內部有兩種算法:
關於這兩種算法這裏不做詳細介紹。
前者指定在某處畫一條弧線,僅此而已,不會受當前paint的位置所影響。而arcTo方法有兩種形式:
addArc
方法沒有區別。//代碼1
Path path = new Path(); path.moveTo(100, 100); path.addArc(200, 200, 400, 400, 0, 150); canvas.drawPath(path, paint);
代碼1效果以下圖:
//代碼2
Path path = new Path(); path.moveTo(100, 100); path.arcTo(200, 200, 400, 400, 0, 150, false); canvas.drawPath(path,paint);
代碼2效果以下圖:
若將代碼2中的arcTo方法的參數修改成true則繪製的效果與代碼1相同。
reset
清除path上的內容,重置path到 path = new Path()的初始狀態。rewind
清除path上的內容,但會保留path上相關的數據結構,以高效的複用。
其它方法
fill-type
設置