HenCoder1-1學習筆記

作者:扔物線

鏈接:https://juejin.im/post/5962a3746fb9a06ba2687226

來源:掘金

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

Paint類的幾個最常用的方法。具體是:

1.Paint.setStyle(Style style)設置繪制模式

setStyle(Style style)這個方法設置的是繪制的Style。Style具體來說有三種:FILL,STROKE和FILL_AND_STROKE。FILL是填充模式,STROKE是畫線模式(即勾邊模式),FILL_AND_STROKE是兩種模式一并使用:既畫線又填充。它的默認值是FILL,填充模式。

2.Paint.setColor(int color)設置顏色

3.Paint.setStrokeWidth(float width)設置線條寬度

在STROKE和FILL_AND_STROKE下,還可以使用paint.setStrokeWidth(float width)

4.Paint.setTextSize(float textSize)設置文字大小

5.Paint.setAntiAlias(boolean aa)設置抗鋸齒開關

在繪制的時候,往往需要開啟抗鋸齒來讓圖形和文字的邊緣更加平滑.另外,還可以在創建Paint對象的時候,直接設置抗鋸齒

Paint ? ?paint ?= ? new ? Paint(Paint.ANTI_ALIAS_FLAG);

因為抗鋸齒的原理是:修改圖形邊緣處的像素顏色,從而讓圖形在肉眼看來具有更加平滑的感覺


二、繪圖Api

1.canvas.drawColor(@ColorInt int color) 顏色填充

drawColor(Color.BLACK)會把整個區域染成純黑色,覆蓋掉原有內容;

drawColor(Color.parse("#88880000")會在原有的繪制效果上加一層半透明的紅色遮罩。

2.canvas.drawCircle(float centerX, float centerY, float radius, Paint paint) 畫圓

centerX,centerY 是圓心坐標,radius是半徑

3.canvas.drawRect(RectF rect, Paint paint) 畫矩形 ? 是具有兼容性的,一般我喜歡用這個

RectF ? rect ? = ?new RectF(100,100,300,300);分別代表左上點的坐標和右下點的坐標,構成一個矩形

4.canvas.drawPoint(float x, float y, Paint paint) 畫點

點的大小可以通過paint.setStrokeWidth(width)來設置;點的形狀可以通過paint.setStrokeCap(cap)來設置:ROUND畫出來是圓形的點,SQUARE或BUTT畫出來是方形的點。

Paint.Cap.ROUND ? ?圓形的點

Paint.Cap.SQUARE ? ? ? / ? ? ? Paint.Cap.BUTT ?放形的點

5.canvas.drawPoints(float[] pts, int offset, int count, Paint paint) ?一次性的化多個點

pts這個數組是點的坐標,每兩個成一對;offset表示跳過數組的前幾個數再開始記坐標;count表示一共要繪制幾個點。

6.canvas.drawPoints(float[] pts, Paint paint) 畫點(批量)

pts這個數組是點的坐標,每兩個成一對;

7.canvas.drawOval(RectF rect, Paint paint)畫橢圓

RectF ?是矩形,其實就是規定在一個矩形里面畫一個橢圓

8.canvas.drawLine(float startX, float startY, float stopX, float stopY, Paint paint) 畫線

float startX, float startY ? 起始點

float stopX, float stopY ?終止點

9.canvas.drawLines(float[] pts, int offset, int count, Paint paint) ?批量畫線

10.canvas.drawRoundRect(RectF rect, float rx, float ry, Paint paint) ?畫圓角的矩形

RectF rect ? 規定一個矩形

float rx, float ry ? 圓角矩形的圓角的橫向半徑和縱向半徑

11.canvas.drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint) 繪制弧形或扇形

drawArc()是使用一個橢圓來描述弧形的。left,top,right,bottom描述的是這個弧形所在的橢圓;

startAngle是弧形的起始角度(x 軸的正向,即正右的方向,是 0 度的位置;順時針為正角度,逆時針為負角度),

sweepAngle是弧形劃過的角度;

useCenter表示是否連接到圓心,如果不連接到圓心,就是弧形,如果連接到圓心,就是扇形。

12.canvas.drawPath(Path path, Paint paint) 畫自定義圖形

drawPath(path)這個方法是通過描述路徑的方式來繪制圖形的,它的path參數就是用來描述圖形路徑的對象。path的類型是Path

三、Path 相關繪制方法與說明

Path ? path = ?new ? Path();

...........path的相關方法

最后別忘記:canvas.drawPath(path,paint);

1.path.addCircle(float x, float y, float radius, Direction dir) 添加圓

參數dir是畫圓的路徑的方向

順時針 (CWclockwise) 和逆時針 (CCWcounter-clockwise) 。對于普通情況,這個參數填CW還是填CCW沒有影響。它只是在需要填充圖形(Paint.Style為FILL或FILL_AND_STROKE) ,并且圖形出現自相交時,用于判斷填充范圍的

2.path.addOval(float left, float top, float right, float bottom, Direction dir) / addOval(RectF oval, Direction dir) 添加橢圓

3.path.addRect(float left, float top, float right, float bottom, Direction dir) / addRect(RectF rect, Direction dir) 添加矩形

4.path.addRoundRect(RectF rect, float rx, float ry, Direction dir) / addRoundRect(float left, float top, float right, float bottom, float rx, float ry, Direction dir) / addRoundRect(RectF rect, float[] radii, Direction dir) / addRoundRect(float left, float top, float right, float bottom, float[] radii, Direction dir) 添加圓角矩形

5.path.addPath(Path path) 添加另一個 Path

6.path.lineTo(float x, float y) / rLineTo(float x, float y) 畫直線

當前位置向目標位置畫一條直線,x和y是目標位置的坐標。這兩個方法的區別是,lineTo(x, y)的參數是絕對坐標,而rLineTo(x, y)的參數是相對當前位置的相對坐標(前綴r指的就是relatively「相對地」)。

當前位置:所謂當前位置,即最后一次調用畫Path的方法的終點位置。初始值為原點 (0, 0)。

7.path.quadTo(float x1, float y1, float x2, float y2) / rQuadTo(float dx1, float dy1, float dx2, float dy2) 畫二次貝塞爾曲線

這條二次貝塞爾曲線的起點就是當前位置,而參數中的x1,y1和x2,y2則分別是控制點和終點的坐標。和rLineTo(x, y)同理,rQuadTo(dx1, dy1, dx2, dy2)的參數也是相對坐標

8.path.cubicTo(float x1, float y1, float x2, float y2, float x3, float y3) / rCubicTo(float x1, float y1, float x2, float y2, float x3, float y3) 畫三次貝塞爾曲線

9.path.moveTo(float x, float y) / rMoveTo(float x, float y) 移動到目標位置,可以指定起點

不論是直線還是貝塞爾曲線,都是以當前位置作為起點,而不能指定起點。但你可以通過moveTo(x, y)或rMoveTo()來改變當前位置,從而間接地設置這些方法的起點。

moveTo(x, y)雖然不添加圖形,但它會設置圖形的起點,所以它是非常重要的一個輔助方法。

10.path.arcTo(RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo) / arcTo(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean forceMoveTo) / arcTo(RectF oval, float startAngle, float sweepAngle) 畫弧形

這個方法和Canvas.drawArc()比起來,少了一個參數useCenter,而多了一個參數forceMoveTo。

少了useCenter,是因為arcTo()只用來畫弧形而不畫扇形,所以不再需要useCenter參數;而多出來的這個forceMoveTo參數的意思是,繪制是要「抬一下筆移動過去ture」,還是「直接拖著筆過去false」,區別在于是否留下移動的痕跡。

11.path.addArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle) / addArc(RectF oval, float startAngle, float sweepAngle)

又是一個弧形的方法。一個叫arcTo,一個叫addArc(),都是弧形,區別在哪里?其實很簡單:addArc()只是一個直接使用了forceMoveTo = true的簡化版arcTo()。即,抬起一下筆移動過去,中間有隔斷的部分,不是連著的

12.path.close() 封閉當前子圖形

它的作用是把當前的子圖形封閉,即由當前位置向當前子圖形的起點繪制一條直線。

close()和lineTo(起點坐標)是完全等價的。

13.path.setFillType(FillType fillType) ? ??

順時針 (CWclockwise) 和逆時針 (CCWcounter-clockwise) 。對于普通情況,這個參數填CW還是填CCW沒有影響。它只是在需要填充圖形(Paint.Style為FILL或FILL_AND_STROKE) ,并且圖形出現自相交時,用于判斷填充范圍的。Path.setFillType(fillType)是用來設置圖形自相交時的填充算法的:

FillType的取值有四個:

EVEN_ODD

對于平面中的任意一點,向任意方向射出一條射線,這條射線和圖形相交的次數(相交才算,相切不算哦)如果是奇數,則這個點被認為在圖形內部,是要被涂色的區域;如果是偶數,則這個點被認為在圖形外部,是不被涂色的區域。還以左右相交的雙圓為例:


WINDING(默認值)

首先,它需要你圖形中的所有線條都是有繪制方向的:



同樣是從平面中的點向任意方向射出一條射線,但計算規則不一樣:以 0 為初始值,對于射線和圖形的所有交點,遇到每個順時針的交點(圖形從射線的左邊向右穿過)把結果加 1,遇到每個逆時針的交點(圖形從射線的右邊向左穿過)把結果減 1,最終把所有的交點都算上,得到的結果如果不是 0,則認為這個點在圖形內部,是要被涂色的區域;如果是 0,則認為這個點在圖形外部,是不被涂色的區域。



圖形的方向:對于添加子圖形類方法(如Path.addCircle()Path.addRect())的方向,由方法的dir參數來控制,這個在前面已經講過了;而對于畫線類的方法(如Path.lineTo()Path.arcTo())就更簡單了,線的方向就是圖形的方向。

完整版的EVEN_ODD和WINDING的效果應該是這樣的



INVERSE_EVEN_ODD

INVERSE_WINDING

14.path.drawBitmap(Bitmap bitmap, float left, float top, Paint paint) 畫 Bitmap

把bitmap繪制到left,top的坐標點的位置上

15.path.drawText(String text, float x, float y, Paint paint) 繪制文字

在x,y的坐標位置繪制文字內容

可以用paint.setTextSize(float textSize) 設置的文字大小

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 系列文章之 Android中自定義View(一)系列文章之 Android中自定義View(二)系列文章之 And...
    YoungerDev閱讀 4,463評論 3 11
  • HenCoder Android 開發進階: 自定義 View 1-1 繪制基礎 視頻重點 自定義繪制的方式是重寫...
    AaronXee閱讀 336評論 0 0
  • 自定義繪制概述 方法:重寫繪制方法(最常用:onDraw()) 繪制的關鍵:CanvasCanvas的繪制類方法:...
    NewSalton閱讀 466評論 0 0
  • 導航 Android Paint之顏色過濾器 Paint之shader(圖像渲染) Paint之PathEffec...
    侯蛋蛋_閱讀 4,658評論 0 5
  • 渴望那一抹綠, 讓人寧靜的綠。 我是從哪兒竄出來的, 我是什么顏色? 渴望那一抹綠, 是家鄉的清香。 哦… 渴望那...
    向往的心向陽閱讀 149評論 0 0