HenCoder1-1學習筆記

作者:扔物線

鏈接: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è)置的文字大小

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末本橙,一起剝皮案震驚了整個濱河市扳躬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌甚亭,老刑警劉巖贷币,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異狂鞋,居然都是意外死亡片择,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門骚揍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來字管,“玉大人啰挪,你說我怎么就攤上這事〕笆澹” “怎么了亡呵?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長硫戈。 經(jīng)常有香客問我锰什,道長,這世上最難降的妖魔是什么丁逝? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任汁胆,我火速辦了婚禮,結(jié)果婚禮上霜幼,老公的妹妹穿的比我還像新娘嫩码。我一直安慰自己,他們只是感情好罪既,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布铸题。 她就那樣靜靜地躺著,像睡著了一般琢感。 火紅的嫁衣襯著肌膚如雪丢间。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天驹针,我揣著相機與錄音烘挫,去河邊找鬼。 笑死牌捷,一個胖子當著我的面吹牛墙牌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播暗甥,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼喜滨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了撤防?” 一聲冷哼從身側(cè)響起虽风,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寄月,沒想到半個月后辜膝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡漾肮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年厂抖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片克懊。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡忱辅,死狀恐怖七蜘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情墙懂,我是刑警寧澤橡卤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站损搬,受9級特大地震影響碧库,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜巧勤,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一嵌灰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧颅悉,春花似錦伞鲫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柒瓣。三九已至儒搭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芙贫,已是汗流浹背搂鲫。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留磺平,地道東北人魂仍。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像拣挪,于是被迫代替她去往敵國和親擦酌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

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