canvas 是繪圖的基礎(chǔ) API ,我們實現(xiàn)自定義 view ,繪制的部分都只能依靠 canvas 來實現(xiàn)。借用 GcsSloop 魔法師的話來說:
一般來說,比較基礎(chǔ)的東西有兩大特點:
- 可操作性強:由于這些是構(gòu)成上層的基礎(chǔ),所以可操作性必然十分強大。
- 比較難用:各種方法太過基礎(chǔ),想要完美的將這些操作組合起來有一定難度。
所以對于 canvas 大家也不要有什么負(fù)擔(dān),我們靜下心來,花上一些時間把 canvas 搞明白是非常必要的,也花不了大家多少時間,canvas 是看著難,但是不難懂的部分
上面就是 canvas 的全部 API 操作了,忘了的可以來看哦,本文是科普查閱文,解釋不是很詳細(xì),更多的請看參考資料
drawColor 繪制顏色
canvas.drawColor(Color.BLUE); //繪制藍(lán)色
在 canvas 畫布上繪制顏色就是繪制背景顏色,這個函數(shù)不能控制繪制區(qū)域,那么就是在整個畫布畫一個顏色,和背景色有什么區(qū)別。而且通過繪制顏色來設(shè)置背景色比設(shè)置背景圖片合適的多,繪制顏色課不會產(chǎn)生 bitmap 位圖,內(nèi)存上開銷少太多了
繪制點
// 繪制一個點
canvas.drawPoint(200, 200, mPaint);
// 繪制一組點,參數(shù)以數(shù)組形式傳入
canvas.drawPoints(new float[]{
200,200,
200,230,
200,260,
200,290
},mPaint);
畫點很簡單了,一看便知,參數(shù)上可以接受一個組數(shù),也可以接受一對數(shù)字
繪制線
// 繪制一個點,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ù)的
繪制矩形
// 第一種
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(單精度浮點型)的
繪制圓角矩形
// 第一種
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 來描述圓弧,注意這個弧既可以是正圓的圓弧,也可以是橢圓的圓弧
繪制橢圓
// 第一種
RectF rectF = new RectF(100,100,800,400);
canvas.drawOval(rectF,mPaint);
// 第二種
canvas.drawOval(100,100,800,400,mPaint);
有了上面圓角矩形的鋪墊,到這里用一個矩形來描述橢圓大家就能理解了把,其實不光是橢圓,弧也可以用矩形來畫
繪制弧
// 第一種
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 度就在上圖的位置了
繪制圓
canvas.drawCircle(500,500,400,mPaint);
canvas 學(xué)習(xí)到這里,畫圓就很簡單了,3個參數(shù)猜也能才出來是啥了,前面2個是圓形中心點坐標(biāo),后面是半徑