概要:
本人在目前項目中很多頁面都需要自定義控件,所以抽出時間對自定義控件進行系統的複習,並對此發表一下本人的拙見,也方便今後複習。
學習之前先看一下,這次分享最終要做的自定義控件吧,整張圖除了中間的文字是TextView 其他的都是畫出來的,而且圓指向柱狀體頂部的箭頭是
通過計算出來位置後畫出來的。這個Demo我會在最後一篇文章中進行分享
好其他不多說開始這次的學習之旅吧!!!
Path類
首先看一下Path類官方說明
* The Path class encapsulates compound (multiple contour) geometric paths
* consisting of straight line segments, quadratic curves, and cubic curves.
* It can be drawn with canvas.drawPath(path, paint), either filled or stroked
* (based on the paint's Style), or it can be used for clipping or to draw
* text on a path.
路徑類封裝化合物(多線)的幾何路徑由直線段組成,二次曲線,三次曲線。它可以繪製drawpath(路徑,油漆),任一填充或魔方(基於塗料的風格),或可用於裁剪或畫
(一)獲取Path
Path path = new Path();
(二)Path的API
//扇形路徑,一個橢圓,起始角,扇形角度
path.addArc(oval, startAngle, sweepAngle);
//正圓路徑
path.addCircle(x, y, radius, dir);
//畫橢圓
path.addOval(oval, dir);
//路徑拼接路徑
path.addPath(src);
//路徑拼接路徑+矩陣
path.addPath(src, matrix);
//路徑
path.addPath(src, dx, dy);
//矩形路徑 + 拼接路徑
path.addRect(rect, dir);
//矩形路徑上下左右 + 拼接路徑
path.addRect(left, top, right, bottom, dir);
//圓角矩形路徑
path.addRoundRect(rect, rx, ry, dir);
//圓形矩陣路徑,通過radii數組設置某一個角的弧度
path.addRoundRect(rect, radii, dir);
//添加指定的弧路徑作爲一個新的輪廓。如果路徑的開始是從不同的電流路徑的最後一點,
//然後自動lineto()添加連接當前輪廓弧線的開始。然而,如果路徑是空的,那麼我們稱moveto()與圓弧的第一點
path.arcTo(oval, startAngle, sweepAngle);
//添加指定的弧路徑作爲一個新的輪廓。如果路徑的開始是從不同的電流路徑的最後一點,
//然後自動lineto()添加連接當前輪廓弧線的開始。然而,如果路徑是空的,那麼我們稱moveto()與圓弧的第一點。360。
path.arcTo(oval, startAngle, sweepAngle, forceMoveTo);
//使最後一個點與第一個點閉合
path.close();
//計算路徑的控制點的範圍,並把答案寫在界限。如果路徑中包含0或1點,邊界設置爲(0,0,0,0)
path.computeBounds(bounds, exact);
//添加一個三次Bezier從最後一點,接近控制點(X1,Y1),(X2,Y2),
//和結束(X3,Y3)。如果沒有moveto()調用了這個輪廓,第一點是自動設定爲(0,0)
path.cubicTo(x1, y1, x2, y2, x3, y3);
//返回路徑的填充類型
path.getFillType();
//提示路徑準備加入更多的點。這可以讓道路更有效地分配存儲
path.incReserve(extraPtCount);
//判斷路徑是否爲空
path.isEmpty();
//如果filltype是反向變異返回true
path.isInverseFillType();
//如果路徑指定一個矩形返回true。如果是這樣的話,如果參數不爲空,設置正確的路徑的界限。如果路徑不指定一個矩形,矩形和忽略返回false。
path.isRect(rect);
//添加了最後一點線指定點(x,y)。如果沒有moveto()調用了這個輪廓,第一點是自動設定爲(0,0)。
path.lineTo(x, y);
//設置的下一個路徑的開始點(x,y)。
path.moveTo(x, y);
//抵消(dx,dy)的路徑,成功返回TRUE
path.offset(dx, dy);
//抵消(dx,dy)的路徑,成功返回TRUE
path.offset(dx, dy, dst);
path.op(path, op);
path.op(path1, path2, op);
//增加二次Bezier從最後一點,接近控制點(X1,Y1),(X2,Y2和結束)。
//如果沒有moveto()調用了這個輪廓,第一點是自動設定爲(0,0)。
path.quadTo(x1, y1, x2, y2);
//cubicto相同,但座標認爲相對於當前點的輪廓。如果沒有以前的點,然後移動到(0,0)是自動插入。
path.rCubicTo(x1, y1, x2, y2, x3, y3);
//從路徑中的任何直線和曲線,使空。這並不改變填充類型設置。
path.reset();
//倒回路徑:清除所有的直線和曲線的路徑,但保持內部數據結構更快的重用。
path.rewind();
//同LineTo,但座標認爲相對於這個輪廓上點。如果沒有以前的點,然後移動到(0,0)是自動插入。
path.rLineTo(dx, dy);
//組相對於以前的輪廓上下點輪廓開始。如果沒有以前的輪廓,這被視爲moveto()相同。
path.rMoveTo(dx, dy);
//quadto相同,但座標認爲相對於這個輪廓上點。如果沒有以前的點,然後移動到(0,0)是自動插入。
path.rQuadTo(dx1, dy1, dx2, dy2);
//SRC的內容替換的內容。
path.set(src);
//設置路徑的填充類型
path.setFillType(ft);
//設置路徑最後一定的位置
path.setLastPoint(dx, dy);
//切換的filltype逆狀態
path.toggleInverseFillType();
//點此路徑的變換矩陣。
path.transform(matrix);
//變換的點在該路徑的矩陣,並把答案寫在DST。如果測試是無效的,那麼原來的路徑修改。
path.transform(matrix, dst);