自定義 view - canvas

canvas 是繪圖的基礎(chǔ) API ,我們實現(xiàn)自定義 view ,繪制的部分都只能依靠 canvas 來實現(xiàn)。借用 GcsSloop 魔法師的話來說:

一般來說,比較基礎(chǔ)的東西有兩大特點:

  • 可操作性強:由于這些是構(gòu)成上層的基礎(chǔ),所以可操作性必然十分強大。
  • 比較難用:各種方法太過基礎(chǔ),想要完美的將這些操作組合起來有一定難度。

所以對于 canvas 大家也不要有什么負(fù)擔(dān),我們靜下心來,花上一些時間把 canvas 搞明白是非常必要的,也花不了大家多少時間,canvas 是看著難,但是不難懂的部分

Snip20181020_26.png

上面就是 canvas 的全部 API 操作了,忘了的可以來看哦,本文是科普查閱文,解釋不是很詳細(xì),更多的請看參考資料

drawColor 繪制顏色


Snip20180718_3.png
canvas.drawColor(Color.BLUE); //繪制藍(lán)色

在 canvas 畫布上繪制顏色就是繪制背景顏色,這個函數(shù)不能控制繪制區(qū)域,那么就是在整個畫布畫一個顏色,和背景色有什么區(qū)別。而且通過繪制顏色來設(shè)置背景色比設(shè)置背景圖片合適的多,繪制顏色課不會產(chǎn)生 bitmap 位圖,內(nèi)存上開銷少太多了

繪制點


Snip20180718_4.png
// 繪制一個點
canvas.drawPoint(200, 200, mPaint);     
 // 繪制一組點,參數(shù)以數(shù)組形式傳入
canvas.drawPoints(new float[]{         
      200,200,
      200,230,
      200,260,
      200,290
},mPaint);

畫點很簡單了,一看便知,參數(shù)上可以接受一個組數(shù),也可以接受一對數(shù)字

繪制線


Snip20180718_5.png
// 繪制一個點,4個數(shù)字,2個點確定一條線
canvas.drawLine(300,300,500,600,mPaint);   
 // 繪制一組點,參數(shù)以數(shù)組形式傳入
canvas.drawLines(new float[]{             
    200,200,260,200,
    200,230,260,230,
    400,230,800,530
},mPaint);

和畫點一樣,畫線也是很簡單的多, 一樣可以接受一組或是多組參數(shù),注意點不連續(xù)的話,畫出來的線也是不連續(xù)的

繪制矩形


Snip20180720_2.png
// 第一種
canvas.drawRect(100,100,800,400,mPaint);

// 第二種
Rect rect = new Rect(100,100,800,400);
canvas.drawRect(rect,mPaint);

// 第三種
RectF rectF = new RectF(100,100,800,400);
canvas.drawRect(rectF,mPaint);

2個點能確定一條線,那么對角線的2個點就能確定一個矩形。具體的 api 3種,區(qū)別就是傳參形式比一樣,本質(zhì)的都是對角線2個點的 x,y 坐標(biāo)

Rect 和 RectF 有什么區(qū)別嗎?

  • 區(qū)別就是精度不同,Rect是int(整形)的,而RectF是float(單精度浮點型)的

繪制圓角矩形


Snip20180720_4.png
// 第一種
RectF rectF = new RectF(100,100,800,400);
canvas.drawRoundRect(rectF,30,30,mPaint);

// 第二種 API21
canvas.drawRoundRect(100,100,800,400,30,30,mPaint);

第二種方法在API21的時候才添加上,所以我們一般使用的都是第一種

圓角矩形比單純的矩形多了2個參數(shù),rx、ry 描述了一個矩形的長和寬,圓角說白了就是一個弧線,我們可以用一個矩形來畫一個弧,所以這里用 rx、ry 來描述圓弧,注意這個弧既可以是正圓的圓弧,也可以是橢圓的圓弧

005Xtdi2jw1f2748fjw2bj308c0dwmx8.jpg

繪制橢圓


Snip20180720_6.png
// 第一種
RectF rectF = new RectF(100,100,800,400);
canvas.drawOval(rectF,mPaint);

// 第二種
canvas.drawOval(100,100,800,400,mPaint);

有了上面圓角矩形的鋪墊,到這里用一個矩形來描述橢圓大家就能理解了把,其實不光是橢圓,弧也可以用矩形來畫

005Xtdi2jw1f274bq1h4rj308c0dwjrl.jpg

繪制弧


Snip20180722_7.png
1785445-e7ae80cbc886632f.png
// 第一種
public void drawArc(@NonNull RectF oval, float startAngle, float sweepAngle, boolean useCenter, @NonNull Paint paint){}
    
// 第二種
public void drawArc(float left, float top, float right, float bottom, float startAngle,
            float sweepAngle, boolean useCenter, @NonNull Paint paint) {}

最后面的三個參數(shù)決定了弧的樣式:

  • startAngle 開始角度
  • sweepAngle 結(jié)束角度
  • useCenter 是否使用中心

startAngle 和 sweepAngel 通過字面意思我們就知道是干什么的了,就是弧的起始位置和結(jié)束位置, 不過這個中心點是干什么的,大家看下面的對比就知道了

RectF rectF = new RectF(100,100,800,400);
// 繪制背景矩形
mPaint.setColor(Color.GRAY);
canvas.drawRect(rectF,mPaint);

// 繪制圓弧
mPaint.setColor(Color.BLUE);
canvas.drawArc(rectF,0,90,false,mPaint);

//-------------------------------------

RectF rectF2 = new RectF(100,600,800,900);
// 繪制背景矩形
mPaint.setColor(Color.GRAY);
canvas.drawRect(rectF2,mPaint);

// 繪制圓弧
mPaint.setColor(Color.BLUE);
canvas.drawArc(rectF2,0,90,true,mPaint);

看圖就理解了,沒什么復(fù)雜的,至于0度在哪的問題,這里畫弧,自然坐標(biāo)原點在矩形的中心,角度的增加是順時針的,所以 0-90 度就在上圖的位置了

繪制圓


Snip20180724_9.png
canvas.drawCircle(500,500,400,mPaint);

canvas 學(xué)習(xí)到這里,畫圓就很簡單了,3個參數(shù)猜也能才出來是啥了,前面2個是圓形中心點坐標(biāo),后面是半徑

參考資料:


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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