Android畫圖Path的使用
/**
* Paint類介紹
*
* Paint即畫筆,在繪圖過程中起到了極其重要的作用,畫筆主要保存了顏色,
* 樣式等繪製信息,指定了如何繪製文本和圖形,畫筆對象有很多設置方法,
* 大體上可以分爲兩類,一類與圖形繪製相關,一類與文本繪製相關。
*
* 1.圖形繪製
* setARGB(int a,int r,int g,int b);
* 設置繪製的顏色,a代表透明度,r,g,b代表顏色值。
*
* setAlpha(int a);
* 設置繪製圖形的透明度。
*
* setColor(int color);
* 設置繪製的顏色,使用顏色值來表示,該顏色值包括透明度和RGB顏色。
*
* setAntiAlias(boolean aa);
* 設置是否使用抗鋸齒功能,會消耗較大資源,繪製圖形速度會變慢。
*
* setDither(boolean dither);
* 設定是否使用圖像抖動處理,會使繪製出來的圖片顏色更加平滑和飽滿,圖像更加清晰
*
* setFilterBitmap(boolean filter);
* 如果該項設置爲true,則圖像在動畫進行中會濾掉對Bitmap圖像的優化操作,加快顯示
* 速度,本設置項依賴於dither和xfermode的設置
*
* setMaskFilter(MaskFilter maskfilter);
* 設置MaskFilter,可以用不同的MaskFilter實現濾鏡的效果,如濾化,立體等 *
* setColorFilter(ColorFilter colorfilter);
* 設置顏色過濾器,可以在繪製顏色時實現不用顏色的變換效果
*
* setPathEffect(PathEffect effect);
* 設置繪製路徑的效果,如點畫線等
*
* setShader(Shader shader);
* 設置圖像效果,使用Shader可以繪製出各種漸變效果
*
* setShadowLayer(float radius ,float dx,float dy,int color);
* 在圖形下面設置陰影層,產生陰影效果,radius爲陰影的角度,dx和dy爲陰影在x軸和y軸上的距離,color爲陰影的顏色
*
* setStyle(Paint.Style style);
* 設置畫筆的樣式,爲FILL,FILL_OR_STROKE,或STROKE
*
* setStrokeCap(Paint.Cap cap);
* 當畫筆樣式爲STROKE或FILL_OR_STROKE時,設置筆刷的圖形樣式,如圓形樣式
* Cap.ROUND,或方形樣式Cap.SQUARE
*
* setSrokeJoin(Paint.Join join);
* 設置繪製時各圖形的結合方式,如平滑效果等
*
* setStrokeWidth(float width);
* 當畫筆樣式爲STROKE或FILL_OR_STROKE時,設置筆刷的粗細度
*
* setXfermode(Xfermode xfermode);
* 設置圖形重疊時的處理方式,如合併,取交集或並集,經常用來製作橡皮的擦除效果
*
* 2.文本繪製
* setFakeBoldText(boolean fakeBoldText);
* 模擬實現粗體文字,設置在小字體上效果會非常差
*
* setSubpixelText(boolean subpixelText);
* 設置該項爲true,將有助於文本在LCD屏幕上的顯示效果
*
* setTextAlign(Paint.Align align);
* 設置繪製文字的對齊方向
*
* setTextScaleX(float scaleX);
* 設置繪製文字x軸的縮放比例,可以實現文字的拉伸的效果
*
* setTextSize(float textSize);
* 設置繪製文字的字號大小
*
* setTextSkewX(float skewX);
* 設置斜體文字,skewX爲傾斜弧度
*
* setTypeface(Typeface typeface);
* 設置Typeface對象,即字體風格,包括粗體,斜體以及襯線體,非襯線體等
*
* setUnderlineText(boolean underlineText);
* 設置帶有下劃線的文字效果
*
* setStrikeThruText(boolean strikeThruText);
* 設置帶有刪除線的效果
*
*/
private class MyView2 extends View {
public MyView2(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.STROKE);//設置爲空心
paint.setStrokeWidth(3);
canvas.drawCircle(40, 40, 30, paint);
canvas.drawRect(10, 90, 70, 150, paint);
canvas.drawRect(10, 170, 70, 200, paint);
canvas.drawOval(new RectF(10, 220, 70, 250), paint);
Path path = new Path();//三角形
path.moveTo(10, 330);
path.lineTo(70, 330);
path.lineTo(40, 270);
path.close();
canvas.drawPath(path, paint);
Path path1 = new Path();//梯形
path1.moveTo(10, 410);//繪畫基點
path1.lineTo(70, 410);
path1.lineTo(55, 350);
path1.lineTo(25, 350);
path1.close();//把開始的點和最後的點連接在一起,構成一個封閉圖形
/*
* 最重要的就是movtTo和close,如果是Style.FILL的話,不設置close,也沒有區別,可是如果是STROKE模式,
* 如果不設置close,圖形不封閉。
*
* 當然,你也可以不設置close,再添加一條線,效果一樣。
*/
canvas.drawPath(path1, paint);
///////////////////////////////////////第二列
paint.setColor(Color.BLUE);
paint.setStyle(Paint.Style.FILL);//設置實心
canvas.drawCircle(120, 40, 30, paint);
canvas.drawRect(90, 90, 150, 150, paint);
canvas.drawRect(90, 170, 150, 200, paint);
RectF re2 = new RectF(90, 220, 150, 250);
canvas.drawOval(re2, paint);
Path path2 = new Path();
path2.moveTo(90, 330);
path2.lineTo(150, 330);
path2.lineTo(120, 270);
path2.close();
canvas.drawPath(path2, paint);
Path path3 = new Path();
path3.moveTo(90, 410);
path3.lineTo(150, 410);
path3.lineTo(135, 350);
path3.lineTo(105, 350);
path3.close();
canvas.drawPath(path3, paint);
////////////////////////////////////////////////////第三列
/*
* LinearGradient shader = new LinearGradient(0, 0, endX, endY, new
* int[]{startColor, midleColor, endColor},new float[]{0 , 0.5f,
* 1.0f}, TileMode.MIRROR);
* 參數一爲漸變起初點座標x位置,參數二爲y軸位置,參數三和四分辨對應漸變終點
* 其中參數new int[]{startColor, midleColor,endColor}是參與漸變效果的顏色集合,
* 其中參數new float[]{0 , 0.5f, 1.0f}是定義每個顏色處於的漸變相對位置, 這個參數可以爲null,如果爲null表示所有的顏色按順序均勻的分佈
*/
Shader mShader = new LinearGradient(0, 0, 100, 100,
new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW },
null, Shader.TileMode.REPEAT);
// Shader.TileMode三種模式
// REPEAT:沿着漸變方向循環重複
// CLAMP:如果在預先定義的範圍外畫的話,就重複邊界的顏色
// MIRROR:與REPEAT一樣都是循環重複,但這個會對稱重複
paint.setShader(mShader);// 用Shader中定義定義的顏色來話
canvas.drawCircle(200, 40, 30, paint);
canvas.drawRect(170, 90, 230, 150, paint);
canvas.drawRect(170, 170, 230, 200, paint);
RectF re3 = new RectF(170, 220, 230, 250);
canvas.drawOval(re3, paint);
Path path4 = new Path();
path4.moveTo(170, 330);
path4.lineTo(230, 330);
path4.lineTo(200, 270);
path4.close();
canvas.drawPath(path4, paint);
Path path5 = new Path();
path5.moveTo(170, 410);
path5.lineTo(230, 410);
path5.lineTo(215, 350);
path5.lineTo(185, 350);
path5.close();
canvas.drawPath(path5, paint);
//////////////////////////////////第4列
paint.setTextSize(24);
canvas.drawText("圓形", 240, 50, paint);
canvas.drawText("正方形", 240, 120, paint);
canvas.drawText("長方形", 240, 190, paint);
canvas.drawText("橢圓形", 240, 250, paint);
canvas.drawText("三角形", 240, 320, paint);
canvas.drawText("梯形", 240, 390, paint);
}
}
/** * Paint類介紹 * * Paint即畫筆,在繪圖過程中起到了極其重要的作用,畫筆主要保存了顏色, * 樣式等繪製信息,指定了如何繪製文本和圖形,畫筆對象有很多設置方法, * 大體上可以分爲兩類,一類與圖形繪製相關,一類與文本繪製相關。 * * 1.圖形繪製 * setARGB(int a,int r,int g,int b); * 設置繪製的顏色,a代表透明度,r,g,b代表顏色值。 * * setAlpha(int a); * 設置繪製圖形的透明度。 * * setColor(int color); * 設置繪製的顏色,使用顏色值來表示,該顏色值包括透明度和RGB顏色。 * * setAntiAlias(boolean aa); * 設置是否使用抗鋸齒功能,會消耗較大資源,繪製圖形速度會變慢。 * * setDither(boolean dither); * 設定是否使用圖像抖動處理,會使繪製出來的圖片顏色更加平滑和飽滿,圖像更加清晰 * * setFilterBitmap(boolean filter); * 如果該項設置爲true,則圖像在動畫進行中會濾掉對Bitmap圖像的優化操作,加快顯示 * 速度,本設置項依賴於dither和xfermode的設置 * * setMaskFilter(MaskFilter maskfilter); * 設置MaskFilter,可以用不同的MaskFilter實現濾鏡的效果,如濾化,立體等 * * setColorFilter(ColorFilter colorfilter); * 設置顏色過濾器,可以在繪製顏色時實現不用顏色的變換效果 * * setPathEffect(PathEffect effect); * 設置繪製路徑的效果,如點畫線等 * * setShader(Shader shader); * 設置圖像效果,使用Shader可以繪製出各種漸變效果 * * setShadowLayer(float radius ,float dx,float dy,int color); * 在圖形下面設置陰影層,產生陰影效果,radius爲陰影的角度,dx和dy爲陰影在x軸和y軸上的距離,color爲陰影的顏色 * * setStyle(Paint.Style style); * 設置畫筆的樣式,爲FILL,FILL_OR_STROKE,或STROKE * * setStrokeCap(Paint.Cap cap); * 當畫筆樣式爲STROKE或FILL_OR_STROKE時,設置筆刷的圖形樣式,如圓形樣式 * Cap.ROUND,或方形樣式Cap.SQUARE * * setSrokeJoin(Paint.Join join); * 設置繪製時各圖形的結合方式,如平滑效果等 * * setStrokeWidth(float width); * 當畫筆樣式爲STROKE或FILL_OR_STROKE時,設置筆刷的粗細度 * * setXfermode(Xfermode xfermode); * 設置圖形重疊時的處理方式,如合併,取交集或並集,經常用來製作橡皮的擦除效果 * * 2.文本繪製 * setFakeBoldText(boolean fakeBoldText); * 模擬實現粗體文字,設置在小字體上效果會非常差 * * setSubpixelText(boolean subpixelText); * 設置該項爲true,將有助於文本在LCD屏幕上的顯示效果 * * setTextAlign(Paint.Align align); * 設置繪製文字的對齊方向 * * setTextScaleX(float scaleX); * 設置繪製文字x軸的縮放比例,可以實現文字的拉伸的效果 * * setTextSize(float textSize); * 設置繪製文字的字號大小 * * setTextSkewX(float skewX); * 設置斜體文字,skewX爲傾斜弧度 * * setTypeface(Typeface typeface); * 設置Typeface對象,即字體風格,包括粗體,斜體以及襯線體,非襯線體等 * * setUnderlineText(boolean underlineText); * 設置帶有下劃線的文字效果 * * setStrikeThruText(boolean strikeThruText); * 設置帶有刪除線的效果 * */
private class MyView2 extends View { public MyView2(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.WHITE); Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.RED); paint.setStyle(Paint.Style.STROKE);//設置爲空心 paint.setStrokeWidth(3); canvas.drawCircle(40, 40, 30, paint); canvas.drawRect(10, 90, 70, 150, paint); canvas.drawRect(10, 170, 70, 200, paint); canvas.drawOval(new RectF(10, 220, 70, 250), paint); Path path = new Path();//三角形 path.moveTo(10, 330); path.lineTo(70, 330); path.lineTo(40, 270); path.close(); canvas.drawPath(path, paint); Path path1 = new Path();//梯形 path1.moveTo(10, 410);//繪畫基點 path1.lineTo(70, 410); path1.lineTo(55, 350); path1.lineTo(25, 350); path1.close();//把開始的點和最後的點連接在一起,構成一個封閉圖形 /* * 最重要的就是movtTo和close,如果是Style.FILL的話,不設置close,也沒有區別,可是如果是STROKE模式, * 如果不設置close,圖形不封閉。 * * 當然,你也可以不設置close,再添加一條線,效果一樣。 */ canvas.drawPath(path1, paint); ///////////////////////////////////////第二列 paint.setColor(Color.BLUE); paint.setStyle(Paint.Style.FILL);//設置實心 canvas.drawCircle(120, 40, 30, paint); canvas.drawRect(90, 90, 150, 150, paint); canvas.drawRect(90, 170, 150, 200, paint); RectF re2 = new RectF(90, 220, 150, 250); canvas.drawOval(re2, paint); Path path2 = new Path(); path2.moveTo(90, 330); path2.lineTo(150, 330); path2.lineTo(120, 270); path2.close(); canvas.drawPath(path2, paint); Path path3 = new Path(); path3.moveTo(90, 410); path3.lineTo(150, 410); path3.lineTo(135, 350); path3.lineTo(105, 350); path3.close(); canvas.drawPath(path3, paint); ////////////////////////////////////////////////////第三列 /* * LinearGradient shader = new LinearGradient(0, 0, endX, endY, new * int[]{startColor, midleColor, endColor},new float[]{0 , 0.5f, * 1.0f}, TileMode.MIRROR); * 參數一爲漸變起初點座標x位置,參數二爲y軸位置,參數三和四分辨對應漸變終點 * 其中參數new int[]{startColor, midleColor,endColor}是參與漸變效果的顏色集合, * 其中參數new float[]{0 , 0.5f, 1.0f}是定義每個顏色處於的漸變相對位置, 這個參數可以爲null,如果爲null表示所有的顏色按順序均勻的分佈 */ Shader mShader = new LinearGradient(0, 0, 100, 100, new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW }, null, Shader.TileMode.REPEAT); // Shader.TileMode三種模式 // REPEAT:沿着漸變方向循環重複 // CLAMP:如果在預先定義的範圍外畫的話,就重複邊界的顏色 // MIRROR:與REPEAT一樣都是循環重複,但這個會對稱重複 paint.setShader(mShader);// 用Shader中定義定義的顏色來話 canvas.drawCircle(200, 40, 30, paint); canvas.drawRect(170, 90, 230, 150, paint); canvas.drawRect(170, 170, 230, 200, paint); RectF re3 = new RectF(170, 220, 230, 250); canvas.drawOval(re3, paint); Path path4 = new Path(); path4.moveTo(170, 330); path4.lineTo(230, 330); path4.lineTo(200, 270); path4.close(); canvas.drawPath(path4, paint); Path path5 = new Path(); path5.moveTo(170, 410); path5.lineTo(230, 410); path5.lineTo(215, 350); path5.lineTo(185, 350); path5.close(); canvas.drawPath(path5, paint); //////////////////////////////////第4列 paint.setTextSize(24); canvas.drawText("圓形", 240, 50, paint); canvas.drawText("正方形", 240, 120, paint); canvas.drawText("長方形", 240, 190, paint); canvas.drawText("橢圓形", 240, 250, paint); canvas.drawText("三角形", 240, 320, paint); canvas.drawText("梯形", 240, 390, paint); } }
Path常用方法
方法 | 作用 | 備註 |
---|---|---|
moveTo | 移動起點 | 移動下一次操作的起點位置 |
lineTo | 連接直線 | 連接上一個點到當前點之間的直線 |
setLastPoint | 設置終點 | 重置最後一個點的位置 |
close | 閉合路勁 | 從最後一個點連接最初的一個點,形成一個閉合區域 |
addRect | 添加矩形 | 添加矩形到當前Path |
addRoundRect | 添加圓角矩形 | 添加圓角矩形到當前Path |
addOval | 添加橢圓 | 添加橢圓到當前Path |
addCircle | 添加圓 | 添加圓到當前Path |
addPah | 添加路勁 | 添加路勁到當前Path |
addArc | 添加圓弧 | 添加圓弧到當前Path |
arcTo | 圓弧 | 繪製圓弧,注意和addArc的區別 |
isEmpty | 是否爲空 | 判定Path是否爲空 |
isRect | 是否爲矩形 | 判定Path是否是一個矩形 |
set | 替換路勁 | 用新的路勁替換當前路勁的所有內容 |
offset | 偏移路勁 | 對當前的路勁進行偏移 |
quadTo | 貝塞爾曲線 | 二次貝塞爾曲線的方法 |
cubicTo | 貝塞爾曲線 | 三次貝塞爾曲線的方法 |
rMoveTo,rlineTo,rQuadTo,rCubicTo | rXxx方法 | 不帶r的方法是基於原點座標系(偏移量),帶r的基於當前點座標系(偏移量) |
op | 布爾操作 | 對兩個Path進行布爾運算(交集,並集)等操作 |
setFillType | 填充模式 | 設置Path的填充模式 |
getFillType | 填充模式 | 獲取Path的填充 |
isInverseFillType | 是否逆填充 | 判斷是否是逆填充模式 |
toggleInverseFillType | 相反模式 | 切換相反的填充模式 |
getFillType | 填充模式 | 獲取Path的填充 |
incReserve | 提示方法 | 提示Path還有多少個點等待加入 |
computeBounds | 計算邊界 | 計算Path的路勁 |
reset,rewind | 重置路勁 | 清除Path中的內容(reset相當於new Path , rewind 會保留Path的數據結構) |
transform | 矩陣操作 | 矩陣變換 |
Path方法使用詳解
使用Path
不僅可以繪製簡單的圖形(如圓形,矩形,直線等),也可以繪製複雜一些的圖形(如正多邊形,五角星等),還有繪製裁剪和繪製文本都會用到Path
。由於方法比較多,我這裏分組來講下。
moveTo , lineTo , setLastPoint , close
先創建畫筆:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
注意paint.setStyle(Paint.Style.FILL);
,設置畫筆爲實心。一些線條將在畫布上看不見。
1、lineTo
首先我們來看看lineTo
,如果你直接moveTo
將看不出效果。
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
爲了方便大家好觀察座標的變化,我在屏幕上畫出了網格,每塊網格的寬高都是100。由於第一次之前沒有過操作,所以默認點就是原點(屏幕左上角),第一次lineTo
就是座標原點到(200,200)之間的直線。第二次lineTo
就是上一次結束點位置(200,200)到(400,0)點之間的直線。
2、moveTo 和setLastPoint
方法預覽:
- 1
- 2
- 3
- 1
- 2
- 3
這兩個方法在作用上有相似之處,卻是兩個不同的東西,具體參考下表:
方法名 | 作用 | 是否影響之前的操作 | 是否影響之後的操作 |
---|---|---|---|
moveTo | 移動下一次操作的起點位置 | 否 | 是 |
setLastPoint | 改變上一次操作點的位置 | 是 | 是 |
來看看下面的例子:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
效果圖:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
效果圖:
當我們繪製線條之前,調用moveTo
和 setLastPoint
效果是一樣的,都是對座標原點(0,0)進行操作。setLastPoint
是重置上一次操作的最後一點,在執行完第一次lineTo
的時候,最後一個點就是(200,200),setLastPoint
更改(200,200)爲(300,100),所以在執行的時候就是(300,100)到(400,
0)之間的連線了。
3、close
方法預覽
- 1
- 1
close
方法連接最後一個點和最初一個點(如果兩個點不重合)形成一個閉合的圖形。
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
效果圖:
上圖中可以看到lineTo(500,100)
直線和lineTo(300,400)
直線,而close
方法就是連接(300,400),(100,100)兩點,形成一個閉合的區域。
注意:close的作用的封閉路徑,如果連接最後一個點和最初一個點任然無法形成閉合的區域,那麼close什麼也不做。
quadTo,cubicTo
二次貝塞爾曲線以及三次貝塞爾曲線。
1、quadTo
方法預覽
- 1
- 1
quadTo
方法其中 (x1,y1) 爲控制點,(x2,y2)爲結束點。
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
效果圖:
2、cubicTo
方法預覽:
- 1
- 1
cubicTo
方法比quadTo
方法多了一個點座標,那麼其中(x1,y1)
爲控制點,(x2,y2)爲控制點,(x3,y3) 爲結束點。
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
繪製的圖形和上面的quadTo
繪製的圖形是一樣的。我們去掉moveTo
來看看運行的效果圖:
如果你想了解貝塞爾曲線公式,請鏈接這裏
addXxx和arcTo
主要是向Path
中添加基本圖形以及區分addArc
和arcTo
1、添加基本圖形
方法預覽:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
我們仔細觀察上面的方法,在最後都有一個Path.Direction
,這是個什麼東東呢?Direction
的意思是方向,指導,趨勢。點進去跟一下你會發現Direction
是一個枚舉類型(Enum)分別有CW(順時針),CCW(逆時針)兩個常量。那麼它的作用主要有以下兩點:
序號 | 作用 |
---|---|
1 | 在添加圖形時確定閉合順序(各個點的記錄順序) |
2 | 對自相交圖形的渲染結果有影響 |
我們先來看看閉合順序的問題,添加一個矩形看看:
- 1
- 2
- 3
- 1
- 2
- 3
我將上面的代碼CW
改成CCW
再運行一次,結果一模一樣,尼瑪區別在哪裏啊。稍安勿躁,想看到區別就要用到setLastPoint
(重置最後一個點的座標)。我們來這樣變變代碼:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
效果立馬現行:
爲什麼圖形會發生奇怪的變化呢。我們先來分析一下,繪製一個矩形至少需要對角線的兩個點,根據這兩個點計算出四條邊然後把四條邊按照順序連接起來。上圖的起始座標是(100,200)按着順時針的方向連接(500,200),(500,400),(100,400)最後連接(100,200)形成一個矩形。setLastPoint
是重置上一個操作點座標及改變(100,400)爲(200,400),所以出現了上圖的效果。
接下來我們看看逆時針的情況:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
效果圖:
我們理清楚了閉合的問題,相交問題與設置填充模式有關。
我以addCircle
方法來講解添加圖形,並不會逐一講解。
- 1
- 2
- 3
- 1
- 2
- 3
繪製圓形,(300,300)點表示圓心座標,200 表示半徑長度。
2、addPath
方法預覽:
- 1
- 2
- 3
- 1
- 2
- 3
addPath方法就是將兩個路徑合併到一起。第二個方法的dx,dy
指的是偏移量,第三個方法是添加到當前path之前先使用Matrix進行變換。來看看下面例子:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
效果圖:
3、addArc與arcTo
方法預覽:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
從方法名字上面看,這兩個方法都是與圓弧有關,那麼他們之間肯定是有區別的:
名稱 | 作用 | 區別 |
---|---|---|
addArc | 添加一個圓弧到Path | 直接添加一個圓弧到path中,和上一次操作點無關 |
arcTo | 添加一個圓弧到Path | 添加一個圓弧到path中,如果圓弧的起點和上次操作點座標不同就連接兩個點 |
startAngle
表示開始圓弧度數(0度與X軸方向對齊,順時針移動,弧度增大)。
注意:sweepAngle
表示運動了多少弧度,並不是結束弧度。
forceMoveTo表示“是否強制使用moveTo”,也就是說是否使用moveTo將上一次操作點移動到圓弧的起點座標。默認是false。
forceMoveTo | 含義 |
---|---|
true | 將最後一個點移動到圓弧起點,即不連接最後一個點與圓弧起點 |
false | 不移動,而是連接最後一個點與圓弧起點(注意之前沒有操作的話,不會連接原點) |
示例:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
效果圖:
我們把 path.arcTo(rectF, 0, 270, true);
改成 path.arcTo(rectF,
0, 270, false);
,來看看效果圖:
從上面兩張圖可以看出明顯的變化。
isEmpty、 isRect、 set 和 offset
isEmpty
判斷path中是否包含內容。
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
isRect
方法預覽:
- 1
- 1
判斷path是否是一個矩形,如果是一個矩形的話,會將矩形的信息存放進參數rect中。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
set
方法預覽:
- 1
- 1
將新的path賦值到現有path。相當於運算符中的“=”,如a=b
,把b
賦值給a
還是一起來看個例子:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
效果圖:
offset
方法預覽:
- 1
- 2
- 1
- 2
這個方法就是對Path
進行一段平移,正方向和X軸,Y軸方向一致(如果dx爲正數則向右平移,反之向左平移;如果dy爲正則向下平移,反之向上平移)。我們看到第二個方法多了一個dst
,這個又是一個什麼玩意呢,其實參數das是存儲平移後的path的。
用例子來說明一下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
效果圖:
從運行效果圖可以看出,雖然我們在dst中添加了一個圓形,但是並沒有表現出來,所以,當dst中存在內容時,dst中原有的內容會被清空,而存放平移後的path。
FillType
方法預覽:
- 1
- 2
- 1
- 2
setFillType
方法中的參數Path.FillType
爲枚舉類型:
FillType值 | 含義 |
---|---|
FillType.WINDING | 取path所有所在區域 默認值 |
FillType.EVEN_ODD | 取path所在並不相交區域 |
FillType.INVERSE_WINDING | 取path所有未佔區域 |
FillType.INVERSE_EVEN_ODD | 取path未佔或相交區域 |
path所在區域
path所在區域
path所在區域
setFillType
WINDING
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
效果圖:
EVEN_ODD
代碼我就不貼了,直接上圖(上mis):
INVERSE_WINDING
INVERSE_EVEN_ODD
isInverseFillType
是否是逆填充模式:WINDING 和 EVEN_ODD 返回false;
INVERSE_WINDING 和 INVERSE_EVEN_ODD 返回true;
toggleInverseFillType
切換相反的填充模式,如果填充模式爲WINDING
則填充模式爲INVERSE_WINDING
,反之爲WINDING
模式;如果填充模式爲EVEN_ODD
則填充模式爲INVERSE_EVEN_ODD
,反之爲EVEN_ODD
模式。
舉個例子:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
效果圖和上面EVEN_ODD
模式一模一樣。
就寫到這裏,文中有什麼寫錯,寫偏的請給我留言。