<font style="text-shadow:0px 0px 15px #FF37FD;">Path</font> === ###### tags: `Android developer` `Kotlin` <font color="Brown">android.graphics.Paint</font> <font color="Brown">封裝了由直線段,二次曲線和三次曲線組成的複合(多個輪廓)幾何路徑。它可以使用canvas.drawPath(path,paint)繪製,可以填充或描邊(基於繪製的樣式),也可以用於剪切或在路徑上繪製文本。</font> ## <font color="sandybrown">Constructors</font> ### <font color="#990DFF">Path( )</font> ### <font color="#990DFF">Path(src: Path?)</font> ## <font color="sandybrown">Nested classes</font> ### <font color="#990DFF">[Direction](https://hackmd.io/gyPzN5NOQaeWzeyAAnnkbQ)</font> ### <font color="#990DFF">[FillType](https://hackmd.io/VLa7LOi6Qw6Kb8uBH6Po2A)</font> ## <font color="sandybrown">方法</font> ### <font color="#990DFF">moveTo(x: Float, y: Float): Unit</font> :::info 將下一個輪廓的開頭設置為點(x,y)。 ::: :::success **參數** x : 新輪廓開始的x坐標 y : 新輪廓開始的y坐標 ::: :::warning **Ex:** ```kotlin= val path=Path() path.moveTo(10f,10f) ``` ::: ### <font color="#990DFF">lineTo(x: Float, y: Float): Unit</font> :::info 從最後一個點到指定點(x,y)添加一條線。如果沒有對此輪廓進行moveTo()調用,則第一個點自動設置為(0,0)。 ::: :::success **參數** x : 一條線末端的x坐標 y : 一條線末端的y坐標 ::: :::warning **Ex:** ```kotlin= val path=Path() path.lineTo(10f,100f) ``` ::: ### <font color="#990DFF">fun close(): Unit</font> :::info 關閉當前輪廓。如果當前點不等於輪廓的第一個點,則自動添加線段。 ::: :::warning **Ex:** ```kotlin= var paint: Paint = Paint().apply { color = Color.RED style=Paint.Style.STROKE strokeWidth = 5f } val path=Path() path.apply { moveTo(10f,10f) lineTo(10f,100f) lineTo(300f,100f) close() } canvas?.drawPath(path,paint) ``` :::danger **輸出結果 :** ![](https://i.imgur.com/tbnTv54.png) ::: ### <font color="#990DFF">arcTo(oval: RectF, startAngle: Float, sweepAngle: Float): Unit</font> :::info 指定的弧作為新輪廓附加到路徑。如果路徑的起點與路徑的當前最後一個點不同,則添加自動lineTo()以將當前輪廓連接到弧的起點。但是,如果路徑為空,那麼我們用弧的第一個點調用moveTo()。 ::: :::success **參數** oval : 橢圓的邊界定義弧的形狀和大小這個值絕對不能null。 startAngle : 弧開始的起始角度(以度為單位) sweepAngle : 順時針測量的掃描角度(以度為單位) ::: :::warning **Ex:** ```kotlin= var paint: Paint = Paint().apply { color = Color.GRAY style=Paint.Style.STROKE strokeWidth = 5f } val path=Path() val rect=RectF(100f,10f,200f,100f) canvas?.drawRect(rect,paint) path.apply { moveTo(10f,10f) arcTo(rect,0f,90f) } paint.color=Color.RED canvas?.drawPath(path,paint) ``` :::danger **輸出結果 :** ![](https://i.imgur.com/EtxDU3b.png) ::: ### <font color="#990DFF">arcTo(oval: RectF, startAngle: Float, sweepAngle: Float, forceMoveTo: Boolean): Unit</font> :::info 指定的弧作為新輪廓附加到路徑。如果路徑的起點與路徑的當前最後一個點不同,則添加自動lineTo()以將當前輪廓連接到弧的起點。但是,如果路徑為空,那麼我們用弧的第一個點調用moveTo()。 ::: :::success **參數** oval : 橢圓的邊界定義弧的形狀和大小這個值絕對不能null。 startAngle : 弧開始的起始角度(以度為單位) sweepAngle : 順時針測量的掃描角度(以度為單位) forceMoveTo : 如果為true,則始終使用弧開始新輪廓 ::: :::warning **Ex:** ```kotlin= var paint: Paint = Paint().apply { color = Color.GRAY style=Paint.Style.STROKE strokeWidth = 5f } val path=Path() val rect=RectF(100f,10f,200f,100f) canvas?.drawRect(rect,paint) path.apply { moveTo(10f,10f) arcTo(rect,0f,90f, true) } paint.color=Color.RED canvas?.drawPath(path,paint) ``` :::danger **輸出結果 :** ![](https://i.imgur.com/lldP1Of.png) ::: ### <font color="#990DFF">addArc(oval: RectF, startAngle: Float, sweepAngle: Float): Unit</font> :::info 指定的弧添加到路徑中作為新輪廓。 ::: :::success **參數** oval : 定義弧的形狀和大小的橢圓的邊界這個值絕對不能null。 startAngle : 弧開始的起始角度(以度為單位) sweepAngle : 順時針測量的掃描角度(以度為單位) ::: :::warning **Ex:** ```kotlin= var paint: Paint = Paint().apply { color = Color.RED style=Paint.Style.STROKE strokeWidth = 5f } val path=Path() val rect=RectF(100f,100f,150f,150f) path.apply { moveTo(10f,10f) lineTo(100f,50f) addArc(rect,0f,90f) } canvas?.drawPath(path,paint) ``` :::danger **輸出結果 :** ![](https://i.imgur.com/cOSkuXZ.png) ::: ### <font color="#990DFF">addRect(rect: RectF, dir: Path.Direction): Unit</font> :::info 在路徑中添加閉合的矩形輪廓 ::: :::success **參數** rect : 要添加為路徑的閉合輪廓的矩形此值絕不能為null。 dir : 矩形輪廓的方向此值絕不能為null。 ::: :::warning **Ex:** ```kotlin= var paint: Paint = Paint().apply { color = Color.RED style=Paint.Style.STROKE strokeWidth = 5f } val CCWPath=Path() val CCWRect=RectF(50f, 50f, 240f, 200f) CCWPath.addRect(CCWRect,Path.Direction.CCW) canvas?.drawPath(CCWPath,paint) val CWPath=Path() val CWRect=RectF(290f, 50f, 480f, 200f) CWPath.addRect(CWRect,Path.Direction.CW) canvas?.drawPath(CWPath,paint) ``` :::danger **輸出結果 :** ![](https://i.imgur.com/yFH9NfZ.png) ::: ### <font color="#990DFF">addRoundRect(rect: RectF, radii: FloatArray, dir: Path.Direction): Unit</font> :::info 在路徑中添加閉合的圓角矩形輪廓。每個角接收兩個半徑值[X,Y]。角落按左上,右上,右下,左下排序 ::: :::success **參數** rect : 要添加到路徑的圓角矩形的邊界此值絕不能是null。 radii : 8個值的數組,4對[X,Y]半徑這個值絕對不能null。 dir : 繞圓角矩形輪廓的方向此值絕不能為null。 ::: :::warning **Ex:** ```kotlin= var paint: Paint = Paint().apply { color = Color.RED style=Paint.Style.STROKE strokeWidth = 5f } val rect=RectF(290f, 50f, 480f, 200f) val radii= floatArrayOf(10f,15f,20f,25f,30f,35f,40f,45f) val path=Path().apply { addRoundRect(rect,radii,Path.Direction.CCW) } canvas?.drawPath(path,paint) ``` :::danger **輸出結果 :** ![](https://i.imgur.com/8Odk7fz.png) ::: ### <font color="#990DFF">addRoundRect(rect: RectF, rx: Float, ry: Float, dir: Path.Direction): Unit</font> :::info 在路徑中添加閉合的圓角矩形輪廓 ::: :::success **參數** rect : 要添加到路徑的圓角矩形的邊界此值絕不能是null。 rx : 圓角矩形的圓角的x半徑 ry : 圓角矩形的圓角的y半徑 dir : 繞圓角矩形輪廓的方向此值絕不能為null。 ::: :::warning **Ex:** ```kotlin= var paint: Paint = Paint().apply { color = Color.RED style=Paint.Style.STROKE strokeWidth = 5f } val rect=RectF(50f, 50f, 240f, 200f) val path=Path().apply { addRoundRect(rect,10f,15f,Path.Direction.CCW) } canvas?.drawPath(path,paint) ``` :::danger **輸出結果 :** ![](https://i.imgur.com/at9BxZ7.png) ::: ### <font color="#990DFF">addCircle(x: Float, y: Float, radius: Float, dir: Path.Direction): Unit</font> :::info 在路徑中添加閉合圓形輪廓 ::: :::success **參數** x : 要添加到路徑的圓心的x坐標 y : 要添加到路徑的圓心的y坐標 radius : 要添加到路徑的圓的半徑 dir : 繞圓的輪廓的方向此值絕不能是null。 ::: :::warning **Ex:** ```kotlin= var paint: Paint = Paint().apply { color = Color.RED style=Paint.Style.STROKE strokeWidth = 5f } val path=Path().apply { addCircle(100f,100f,50f,Path.Direction.CCW) } canvas?.drawPath(path,paint) ``` :::danger **輸出結果 :** ![](https://i.imgur.com/UQYyACv.png) ::: ### <font color="#990DFF">addOval(oval: RectF, dir: Path.Direction): Unit</font> :::info 在路徑中添加封閉的橢圓形輪廓 ::: :::success **參數** oval : 橢圓的邊界,作為閉合輪廓添加到路徑中此值絕不能為null。 dir : 繞橢圓形輪廓的方向此值絕不能為null。 ::: :::warning **Ex:** ```kotlin= var paint: Paint = Paint().apply { color = Color.RED style=Paint.Style.STROKE strokeWidth = 5f } val rect=RectF(10f,10f,200f,200f) val path=Path().apply { addOval(rect,Path.Direction.CCW) } canvas?.drawPath(path,paint) ``` :::danger **輸出結果 :** ![](https://i.imgur.com/KeixCat.png) ::: ### <font color="#990DFF">reset(): Unit</font> :::info 清除路徑中的所有線條和曲線,使其變空。這不會更改填充類型設置。 ::: :::warning **Ex:** ```kotlin= var paint: Paint = Paint().apply { color = Color.RED style=Paint.Style.FILL strokeWidth = 5f } val path=Path().apply { fillType=Path.FillType.INVERSE_WINDING reset() addCircle(100f,100f,50f,Path.Direction.CCW) } canvas?.drawPath(path,paint) ``` :::danger **輸出結果 :** ![](https://i.imgur.com/jCIyFG1.png) ::: ### <font color="#990DFF">rewind(): Unit</font> :::info 回退路徑:清除路徑中的所有行和曲線,但保留內部數據結構以便更快地重用。 ::: :::warning **Ex:** ```kotlin= var paint: Paint = Paint().apply { color = Color.RED style=Paint.Style.FILL strokeWidth = 5f } val path=Path().apply { fillType=Path.FillType.INVERSE_WINDING rewind() addCircle(100f,100f,50f,Path.Direction.CW) } canvas?.drawPath(path,paint) ``` :::danger **輸出結果 :** ![](https://i.imgur.com/rn5obtU.png) :::