作者:扔物線
鏈接:https://juejin.im/post/5962a3746fb9a06ba2687226
來源:掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)净宵,非商業(yè)轉(zhuǎn)載請注明出處。
Paint類的幾個最常用的方法轿钠。具體是:
1.Paint.setStyle(Style style)設(shè)置繪制模式
setStyle(Style style)這個方法設(shè)置的是繪制的Style剪芍。Style具體來說有三種:FILL,STROKE和FILL_AND_STROKE。FILL是填充模式剪菱,STROKE是畫線模式(即勾邊模式),F(xiàn)ILL_AND_STROKE是兩種模式一并使用:既畫線又填充拴签。它的默認值是FILL孝常,填充模式。
2.Paint.setColor(int color)設(shè)置顏色
3.Paint.setStrokeWidth(float width)設(shè)置線條寬度
在STROKE和FILL_AND_STROKE下蚓哩,還可以使用paint.setStrokeWidth(float width)
4.Paint.setTextSize(float textSize)設(shè)置文字大小
5.Paint.setAntiAlias(boolean aa)設(shè)置抗鋸齒開關(guān)
在繪制的時候构灸,往往需要開啟抗鋸齒來讓圖形和文字的邊緣更加平滑.另外,還可以在創(chuàng)建Paint對象的時候岸梨,直接設(shè)置抗鋸齒
Paint ? ?paint ?= ? new ? Paint(Paint.ANTI_ALIAS_FLAG);
因為抗鋸齒的原理是:修改圖形邊緣處的像素顏色喜颁,從而讓圖形在肉眼看來具有更加平滑的感覺。
二曹阔、繪圖Api
1.canvas.drawColor(@ColorInt int color) 顏色填充
drawColor(Color.BLACK)會把整個區(qū)域染成純黑色半开,覆蓋掉原有內(nèi)容;
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);分別代表左上點的坐標和右下點的坐標,構(gòu)成一個矩形
4.canvas.drawPoint(float x, float y, Paint paint) 畫點
點的大小可以通過paint.setStrokeWidth(width)來設(shè)置漓库;點的形狀可以通過paint.setStrokeCap(cap)來設(shè)置:ROUND畫出來是圓形的點,SQUARE或BUTT畫出來是方形的點园蝠。
Paint.Cap.ROUND ? ?圓形的點
Paint.Cap.SQUARE ? ? ? / ? ? ? Paint.Cap.BUTT ?放形的點
5.canvas.drawPoints(float[] pts, int offset, int count, Paint paint) ?一次性的化多個點
pts這個數(shù)組是點的坐標渺蒿,每兩個成一對;offset表示跳過數(shù)組的前幾個數(shù)再開始記坐標彪薛;count表示一共要繪制幾個點茂装。
6.canvas.drawPoints(float[] pts, Paint paint) 畫點(批量)
pts這個數(shù)組是點的坐標,每兩個成一對善延;
7.canvas.drawOval(RectF rect, Paint paint)畫橢圓
RectF ?是矩形少态,其實就是規(guī)定在一個矩形里面畫一個橢圓
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 ? 規(guī)定一個矩形
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參數(shù)就是用來描述圖形路徑的對象畸颅。path的類型是Path
三、Path 相關(guān)繪制方法與說明
Path ? path = ?new ? Path();
...........path的相關(guān)方法
最后別忘記:canvas.drawPath(path,paint);
1.path.addCircle(float x, float y, float radius, Direction dir) 添加圓
參數(shù)dir是畫圓的路徑的方向
順時針 (CWclockwise) 和逆時針 (CCWcounter-clockwise) 妒峦。對于普通情況重斑,這個參數(shù)填CW還是填CCW沒有影響。它只是在需要填充圖形(Paint.Style為FILL或FILL_AND_STROKE) 肯骇,并且圖形出現(xiàn)自相交時窥浪,用于判斷填充范圍的
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是目標位置的坐標笛丙。這兩個方法的區(qū)別是漾脂,lineTo(x, y)的參數(shù)是絕對坐標,而rLineTo(x, y)的參數(shù)是相對當前位置的相對坐標(前綴r指的就是relatively「相對地」)胚鸯。
當前位置:所謂當前位置骨稿,即最后一次調(diào)用畫Path的方法的終點位置。初始值為原點 (0, 0)。
7.path.quadTo(float x1, float y1, float x2, float y2) / rQuadTo(float dx1, float dy1, float dx2, float dy2) 畫二次貝塞爾曲線
這條二次貝塞爾曲線的起點就是當前位置坦冠,而參數(shù)中的x1,y1和x2,y2則分別是控制點和終點的坐標形耗。和rLineTo(x, y)同理,rQuadTo(dx1, dy1, dx2, dy2)的參數(shù)也是相對坐標
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()來改變當前位置判呕,從而間接地設(shè)置這些方法的起點倦踢。
moveTo(x, y)雖然不添加圖形,但它會設(shè)置圖形的起點侠草,所以它是非常重要的一個輔助方法辱挥。
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()比起來飒责,少了一個參數(shù)useCenter乳蓄,而多了一個參數(shù)forceMoveTo。
少了useCenter友题,是因為arcTo()只用來畫弧形而不畫扇形奥吩,所以不再需要useCenter參數(shù)哼蛆;而多出來的這個forceMoveTo參數(shù)的意思是,繪制是要「抬一下筆移動過去ture」霞赫,還是「直接拖著筆過去false」腮介,區(qū)別在于是否留下移動的痕跡。
11.path.addArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle) / addArc(RectF oval, float startAngle, float sweepAngle)
又是一個弧形的方法端衰。一個叫arcTo叠洗,一個叫addArc(),都是弧形旅东,區(qū)別在哪里灭抑?其實很簡單:addArc()只是一個直接使用了forceMoveTo = true的簡化版arcTo()。即抵代,抬起一下筆移動過去腾节,中間有隔斷的部分,不是連著的
12.path.close() 封閉當前子圖形
它的作用是把當前的子圖形封閉荤牍,即由當前位置向當前子圖形的起點繪制一條直線案腺。
close()和lineTo(起點坐標)是完全等價的。
13.path.setFillType(FillType fillType) ? ??
順時針 (CWclockwise) 和逆時針 (CCWcounter-clockwise) 康吵。對于普通情況劈榨,這個參數(shù)填CW還是填CCW沒有影響。它只是在需要填充圖形(Paint.Style為FILL或FILL_AND_STROKE) 晦嵌,并且圖形出現(xiàn)自相交時同辣,用于判斷填充范圍的拷姿。Path.setFillType(fillType)是用來設(shè)置圖形自相交時的填充算法的:
FillType的取值有四個:
EVEN_ODD
對于平面中的任意一點,向任意方向射出一條射線旱函,這條射線和圖形相交的次數(shù)(相交才算响巢,相切不算哦)如果是奇數(shù),則這個點被認為在圖形內(nèi)部棒妨,是要被涂色的區(qū)域抵乓;如果是偶數(shù),則這個點被認為在圖形外部靶衍,是不被涂色的區(qū)域。還以左右相交的雙圓為例:
WINDING(默認值)
首先茎芋,它需要你圖形中的所有線條都是有繪制方向的:
同樣是從平面中的點向任意方向射出一條射線颅眶,但計算規(guī)則不一樣:以 0 為初始值,對于射線和圖形的所有交點田弥,遇到每個順時針的交點(圖形從射線的左邊向右穿過)把結(jié)果加 1涛酗,遇到每個逆時針的交點(圖形從射線的右邊向左穿過)把結(jié)果減 1,最終把所有的交點都算上偷厦,得到的結(jié)果如果不是 0商叹,則認為這個點在圖形內(nèi)部,是要被涂色的區(qū)域只泼;如果是 0剖笙,則認為這個點在圖形外部,是不被涂色的區(qū)域请唱。
圖形的方向:對于添加子圖形類方法(如Path.addCircle()Path.addRect())的方向弥咪,由方法的dir參數(shù)來控制,這個在前面已經(jīng)講過了十绑;而對于畫線類的方法(如Path.lineTo()Path.arcTo())就更簡單了聚至,線的方向就是圖形的方向。
完整版的EVEN_ODD和WINDING的效果應(yīng)該是這樣的
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的坐標位置繪制文字內(nèi)容
可以用paint.setTextSize(float textSize) 設(shè)置的文字大小