Android的Paint、Canvas和Path基本使用總結

     繪畫是自定義View的基礎,Paint和canvas至關於繪畫中的畫筆和紙,掌握Paint和canvas可使咱們更加容易進行自定義View。canvas

Paint:

     1、setAntiAlias()
        通常用於繪製不規則圖形的時候,使用抗鋸齒,好比圓形、文字等。對於規則的圖形,是不須要打開抗鋸齒功能的,好比矩形。 bash

     2、setStyle()
        設置填充的樣式,主要用於控制幾何圖形
函數

  • Paint.Style.FILL 填充內部
  • Paint.Style.FILL_AND_STROKE 填充內部和描邊
  • Paint.Style.STROKE 僅描邊

     3、setStrokeWidth()
        設置畫筆的寬度,單位是px.對畫筆的STYLE設置成STROKE和FILL_AND_STROKE時有效。但畫支線時不管style設置什麼值,均有效。
工具

注意事項:
     當設置較大stroke畫圓,而且繪畫的範圍佔滿(基本佔滿)畫布或rect時,stroke會超出繪畫範圍。此時須要將原來的圓半徑減去stroke一半獲得的長度做爲新圓的半徑。stroke超出的長度其實爲stroke寬度的一半。

對於橢圓也差很少:

     4、Paint.Cap
        Cap指定了描邊線和路徑的開始和結束的處理。默認爲BUTT。
字體

  • Paint.Cap.BUTT 無線帽
  • Paint.Cap.ROUND 圓形線帽
  • Paint.Cap.SQUARE 方形線帽

     5、Paint.Join
        Join指定線條和曲線段在描邊路徑上鍊接的處理。默認爲MITER。
ui

  • Paint.Join.BEVEL 鏈接的外邊緣以直線相交
  • Paint.Join.MITER 鏈接的外邊緣以銳角相交
  • Paint.Join.ROUND 鏈接的外邊緣以圓弧相交

        當畫筆style設置爲STROKE或者FILL_AND_STROKE時,繪畫圖形或繪畫路徑,會根據畫筆的Join值對線與線之間的結合處進行處理。

Canvas:

     1、畫背景
        canvas提供3種方法能夠用於繪製畫布的背景
spa

void drawColor(int color)
void drawARGB(int a,int r,int g,int b)
void drawRGB(int r,int g,int b)
複製代碼

     2、畫直線
3d

  • startX: 起始點X座標
  • startY: 起始點Y座標
  • stopX: 終點X座標
  • stopY: 終點Y座標
void drawLine(float startX, float startY, float stopX, float stopY, Paint paint)
複製代碼

     3、畫矩形
          矩形的範圍可使用兩個矩形工具類進行設置:Rect 和 RectF,二者的主要區別就是Rect存儲的上下左右均爲Int類型,而RectF存儲的上下左右均爲Float類型。 rest

     畫圓角矩形:

  • rect 矩形的範圍
  • rx 生成圓角的x軸半徑
  • ry 生成圓角的y軸半徑
    但drawRoundRect()方法只能生成四個圓角都是一致的矩形:
    若是想生成圓角不一致的圓角,可以使用shape標籤:

     4、畫弧
code

  • RectF 圓弧繪畫的矩形範圍。
  • startAngle 開始的角度。
  • sweepAngle 整條弧跨越的弧度。
  • useCenter 若是爲true,則在弧形中包含橢圓的中心並閉合它。
    畫筆不一樣的style和drawArc()useCenter的值可繪畫出不一樣的圓弧或弧線:

注意事項:
     canvas畫弧時,0度的起始位置在x軸正方向上。

     5、畫文字

  • text 繪畫的文本
  • start 第一個字符的索引
  • end 文本的最後一個字符的索引
  • x 文本繪畫的起始x軸位置
  • y 基線(BaseLine)

     前面幾個參數都很好理解,無非就是文本、索引值和繪畫起始的x軸位置,但基線是什麼,怎麼求呢? Baseline是文字繪製時所參照的基準線,觀察下圖可看見基線是大部分英文字母的底部沿線。只有肯定Baseline的位置,才能將文字準確的繪製在咱們想要的位置上。

須要先理清楚一些概念:
     一、基線並非中心線
     二、FontMetricsInt.top表示BaseLine到頂部的距離
     三、FontMetricsInt.bottom表示BaseLine到底部的距離
     四、dy表示BaseLine到中心線的距離
     五、BaseLine = 中心線 + dy
     六、dy = 中心線 - FontMetricsInt.bottom。由於FontMetricsInt.bottom表示BaseLine到底部的距離。
     七、FontMetricsInt.top是一個負值,FontMetricsInt.bottom是一個正數。因此求改文字的中心線時,等於(FontMetricsInt.bottom - FontMetricsInt.top)/ 2
     中心線是按文字的所在的位置決定的。以聯繫人中的字母索引列表爲例,每一個字母的所須要繪畫的高都不同,須要計算每一個字母可佔據的高度,再除以一半求出中心線的位置。

     6、裁剪
     剪切是對canvas的裁剪操做,並不影響原來的以前已經畫好的圖形。
     以clipRect()裁剪變色字體爲例:

     7、save()和restore()
     每次調用save(),都會先保存當前畫布的狀態,而後將其放入到特定的棧中。
     每次調用restore(),都會把棧頂的畫布取出來,並按照這個狀態恢復當前的畫布,而後在這個畫布上做畫。
     clipXX系列的函數對畫布的操做是不可逆的,除非調用了save()和restore()對畫布進行保存和恢復。

Path:

     path表明路徑,在canvas中使用drawPath(Path,Paint)進行繪畫路徑。

     1、畫直線路徑

void moveTo(float x1,float y1)
void lineTo(float x2,float y2)
void close()
複製代碼

     (x1,y1)是直線的起始點,(x2,y2)是直線的終點,又是下一個繪製直線路徑的起始點,lineTo能夠無限用。
     調用了moveTo()後,調用lineTo()畫了N條直線,尚未造成閉環的話,能夠調用close()將路徑的首尾鏈接起來。

     2、畫弧形路徑

     使用3參的arcTo()方法畫出的弧會和起始點相連,由於默認狀況下路徑都是連貫的,除非如下兩種狀況:
     一、調用addXX系列函數,直接添加固定形狀的路徑
     二、moveTo()改變起始位置
調用4參的arcTo()方法,將第4個參數forceMoveTo設置爲true,會使弧的起始點做爲繪製的起始點。

     3、addXXX系列函數
     路徑默認是連貫的,但addXXX()系列函數能夠直接添加一些固定形狀的路徑,沒必要考慮連貫性。
     一、添加矩形路徑

Path.Direction 用於指定如何封閉的形狀(如矩形、橢圓形)。

  • Path.Direction.CCW: 指建立逆時針方向的矩形路徑。
  • Path.Direction.CW: 指建立順時針方向的矩形路徑。


     目前順時針和逆時針的生成對矩形圖形並沒有影響,但對於根據路徑方向繪畫文字等,則會起到關鍵做用。

     二、添加圓角矩形路徑

     繪畫圓角矩形路徑對比繪畫圓角矩形多了兩個重載方法,其中float[] radii參數時用於定義4個角的橢圓各自的x軸半徑和y軸半徑,換句話說,即便用addRoundRect()也能夠實現4個圓角不一樣的矩形。但圓角的順序並不由於Path.Direction值的不一樣而有所改變。

     三、添加圓形路徑

     具體參數和canvas繪製圓同樣, x 爲圓心X軸座標, y 爲圓心y軸座標,radius 爲圓的半徑。

     四、添加橢圓路徑

     具體參數和canvas繪製橢圓同樣

     五、添加圓弧路徑

     具體參數和canvas繪製圓弧同樣

補充:

     1、測量文本寬高
     一、經過Paint.measureText測量文本寬度
     二、經過Paint.getTextBounds得到文字所在的矩形區域,能夠的到寬高
     三、經過Paint.FontMetrics or Paint.FontMetricsInt得到文本寬度

通常使用方案二進行對文本寬高的測量,最精準。

demo連接: 連接:pan.baidu.com/s/1GrP1XYFg… 提取碼:wubw

相關文章
相關標籤/搜索