作者:扔物線
鏈接: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) 設置的文字大小