Android自定義View-Canvas繪制圖形

一.Canvas簡(jiǎn)介

Canvas我們可以稱之為畫布,能夠在上面繪制各種東西,是安卓平臺(tái)2D圖形繪制的基礎(chǔ),非常強(qiáng)大。

二.Canvas的常用操作速查表


官方文檔

三.Canvas詳解

繪制顏色:

繪制顏色是填充整個(gè)畫布,常用于繪制底色。

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

創(chuàng)建畫筆:

要想繪制內(nèi)容,首先需要先創(chuàng)建一個(gè)畫筆,如下:

// 1.創(chuàng)建一個(gè)畫筆
private Paint mPaint = new Paint();

// 2.初始化畫筆
private void initPaint() {
mPaint.setColor(Color.BLACK);       //設(shè)置畫筆顏色
mPaint.setStyle(Paint.Style.FILL);  //設(shè)置畫筆模式為填充
mPaint.setStrokeWidth(10f);         //設(shè)置畫筆寬度為10px
}

// 3.在構(gòu)造函數(shù)中初始化
public SloopView(Context context, AttributeSet attrs) {
super(context, attrs);
 initPaint();
}

繪制點(diǎn):

可以繪制一個(gè)點(diǎn),也可以繪制一組點(diǎn),如下:

canvas.drawPoint(200, 200, mPaint);     //在坐標(biāo)(200,200)位置繪制一個(gè)點(diǎn)
canvas.drawPoints(new float[]{          //繪制一組點(diǎn),坐標(biāo)位置由float數(shù)組指定
  500,500,
  500,600,
  500,700
},mPaint);

繪制直線:

繪制直線需要兩個(gè)點(diǎn),初始點(diǎn)和結(jié)束點(diǎn),同樣繪制直線也可以繪制一條或者繪制一組:

canvas.drawLine(300,300,500,600,mPaint);    // 在坐標(biāo)(300,300)(500,600)之間繪制一條直線
canvas.drawLines(new float[]{               // 繪制一組線 每四數(shù)字(兩個(gè)點(diǎn)的坐標(biāo))確定一條線
100,200,200,200,
100,300,200,300
},mPaint);

繪制矩形:

確定確定一個(gè)矩形最少需要四個(gè)數(shù)據(jù),就是對(duì)角線的兩個(gè)點(diǎn)的坐標(biāo)值,這里一般采用左上角和右下角的兩個(gè)點(diǎn)的坐標(biāo)。

關(guān)于繪制矩形,Canvas提供了三種重載方法,第一種就是提供四個(gè)數(shù)值(矩形左上角和右下角兩個(gè)點(diǎn)的坐標(biāo))來(lái)確定一個(gè)矩形進(jìn)行繪制。 其余兩種是先將矩形封裝為Rect或RectF(實(shí)際上仍然是用兩個(gè)坐標(biāo)點(diǎn)來(lái)確定的矩形),然后傳遞給Canvas繪制,如下:

兩者最大的區(qū)別就是精度不同,Rect是int(整形)的,而RectF是float(單精度浮點(diǎn)型)的

// 第一種
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);

以上三種方法所繪制出來(lái)的結(jié)果是完全一樣的。

繪制圓角矩形:

繪制圓角矩形也提供了兩種重載方式,如下:

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

// 第二種
canvas.drawRoundRect(100,100,800,400,30,30,mPaint);
//上面兩種方法繪制效果也是一樣的,但鑒于第二種方法在API21的時(shí)候才添加上,所以我們一般使用的都是第一種。

繪制橢圓:

相對(duì)于繪制圓角矩形,繪制橢圓就簡(jiǎn)單的多了,因?yàn)樗恍枰粋€(gè)矩形作為參數(shù):

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

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

繪制圓:

繪制圓形也比較簡(jiǎn)單, 如下:
繪制圓形有四個(gè)參數(shù),前兩個(gè)是圓心坐標(biāo),第三個(gè)是半徑,最后一個(gè)是畫筆。

canvas.drawCircle(500,500,400,mPaint);  // 繪制一個(gè)圓心坐標(biāo)在(500,500),半徑為400 的圓。

繪制圓?。?/p>

繪制圓弧就比較神奇一點(diǎn)了,為了理解這個(gè)比較神奇的東西,我們先看一下它需要的幾個(gè)參數(shù):

// 第一種
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) {}

從上面可以看出,相比于繪制橢圓,繪制圓弧還多了三個(gè)參數(shù):

startAngle  // 開始角度
sweepAngle  // 掃過(guò)角度
useCenter   // 是否使用中心

通過(guò)字面意思我們基本能猜測(cè)出來(lái)前兩個(gè)參數(shù)(startAngle, sweepAngel)的作用,就是確定角度的起始位置和掃過(guò)角度, 不過(guò)第三個(gè)參數(shù)是干嘛的?試一下就知道了,上代碼:

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);

述代碼實(shí)際上是繪制了一個(gè)起始角度為0度,掃過(guò)90度的圓弧,兩者的區(qū)別就是是否使用了中心點(diǎn),結(jié)果如下:

簡(jiǎn)要介紹Paint

繪制的基本形狀由Canvas確定,但繪制出來(lái)的顏色,具體效果則由Paint確定。

mPaint.setStyle(Paint.Style.FILL);  //設(shè)置畫筆模式為填充

實(shí)際上畫筆有三種模式,如下:

STROKE                //描邊
FILL                  //填充
FILL_AND_STROKE       //描邊加填充
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容