編輯:Android資訊
Path作為Android中一種相對復雜的繪圖方式,官方文檔中的有些解釋並不是很好理解,這裡作一個相對全面一些的總結,供日後查看,也分享給大家,共同進步。
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
方法方便用來基於之前的繪制作連續繪制。
//原型 op(Path path, Path.Op op) //eg path1.op(path2,Path.Op.DIFFERENCE);
此方法用於對兩個Path對象做相應的運算組合(combine),具體的說是根據不同的op
參數及path2參數來影響path1對象,有點類似於數學上的集合運算。請看下面的例子:
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的第二個參數依次可以得到如下效果:
Path.Op.INTERSECT
效果:
Path.Op.UNION
效果:
Path.Op.REVERSE_DIFFERENCE
效果:
Path.Op.XOR
效果:
設置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
設置在這篇教程中,我們將對之前所添加的Button元素進行設置以實現對用戶點擊的檢測與響應。為了達成這一目標,我們需要在應用程序的主Activity類中略微涉及Jav
前言 讓我一起來看看 Iván Carballo和他的團隊是如何使用Espresso, Mockito 和Dagger 2 編寫250個UI測試,並且只花了三分鐘
Java是垃圾回收語言的一種,其優點是開發者無需特意管理內存分配,降低了應用由於局部故障(segmentation fault)導致崩潰,同時防止未釋放的內存把堆
之前有人在知乎提問: “怎麼計算apk的啟動時間?” : 利用python或者直接用adb命令怎麼計算apk的啟動時間呢?就是計算從點擊圖標到apk完全啟動所