Paint/Canvas/Path高級繪制【2】

Canvas

1. 概念

畫布,通過畫筆繪制幾何圖形、文本、路徑和位圖等

2. 常用API類型

分為 繪制,變換,狀態(tài)保存和恢復(fù)

2.1 繪制幾何圖形,文本,位圖等

//在指定坐標(biāo)繪制位圖
void drawBitmap(Bitmap bitmap, float left, float top, Paint paint)

//根據(jù)給定的起始點和結(jié)束點之間繪制連線
void drawLine(float startXm, float startYm, float stopX, float stopY, Paint paint)

//根據(jù)給定的path,繪制連線
void drawPath(Path path, Paint paint)

//根據(jù)給定的坐標(biāo),繪制點
void drawPoint(float x, float y, Paint paint)

//根據(jù)給定的坐標(biāo),繪制文字
void drawText(String text, int start, int end, Paint paint)

2.2 位置,形狀變換等

//平移操作
void translate(float dx, float dy)

//縮放操作
void scale(float sx, float sy)

//旋轉(zhuǎn)操作
void rotate(float degrees)

//傾斜操作
void skew(float sx, float sy)

//切割操作,參數(shù)指定區(qū)域內(nèi)可以繼續(xù)繪制
void clipXXX(...)

//反向切割操作,參數(shù)指定區(qū)域內(nèi)不可以繪制
void clipOutXXX(...)

//可通過matrix實現(xiàn)平移,縮放,旋轉(zhuǎn)等操作
void setMatrix(Matrix matrix)

詳解:

2.2.1 平移操作

canvas.drawRect(0, 0, 400, 400, mPaint);
canvas.translate(50, 50);
mPaint.setColor(Color.GRAY);
canvas.drawRect(0, 0, 400, 400, mPaint); //灰色矩形框左上頂點坐標(biāo)為(50,50)
平移效果1

平移后坐標(biāo)圖示意圖

2.2.2 縮放操作

canvas.drawRect(200, 200, 700, 700, mPaint);
canvas.scale(0.5f, 0.5f);//效果1

//會translate(px, py),再scale(sx, sy),再反向translate(-px, -py)
canvas.scale(0.5f, 0.5f, 200, 200);//效果2
//即 等同于
canvas.translate(200, 200); 
canvas.scale(0.5f, 0.5f);
canvas.translate(-200, -200);

mPaint.setColor(Color.GRAY);
canvas.drawRect(200, 200, 700, 700, mPaint);  

縮放效果1

縮放效果2

2.2.3 旋轉(zhuǎn)操作

canvas.translate(50, 50);
canvas.drawRect(0, 0, 700, 700, mPaint);
canvas.rotate(45);//效果1 按(0, 0)坐標(biāo)為圓心 順時針旋轉(zhuǎn)!
mPaint.setColor(Color.GRAY);
canvas.drawRect(0, 0, 700, 700, mPaint);  

canvas.drawRect(400, 400, 900, 900, mPaint);
canvas.rotate(45, 650, 650);//效果2 按(650, 650)坐標(biāo)為圓心 順時針旋轉(zhuǎn)!
mPaint.setColor(Color.GRAY);
canvas.drawRect(400, 400, 900, 900, mPaint);
旋轉(zhuǎn)效果1

旋轉(zhuǎn)效果2

2.2.4 傾斜操作

canvas.drawRect(0, 0, 400, 400, mPaint);
canvas.skew(1, 0);//效果1 在x方向傾斜45度(y軸逆時針旋轉(zhuǎn)45度) sx代表tan(degree)的值
canvas.skew(0, 1);//效果2 在y方向傾斜45度(x軸順時針旋轉(zhuǎn)45度)
mPaint.setColor(Color.GRAY);
canvas.drawRect(0, 0, 400, 400, mPaint);
傾斜效果1

傾斜效果2

2.2.5 切割操作

canvas.drawRect(200, 200, 700, 700, mPaint);
mPaint.setColor(Color.GRAY);
canvas.drawRect(200, 800, 700, 1300, mPaint);
canvas.clipRect(200, 200, 700, 700); //效果1 畫布被裁減
canvas.drawCircle(100, 100, 100, mPaint); //坐標(biāo)超出裁剪區(qū)域,無法繪制
canvas.drawCircle(300, 300, 100, mPaint); //坐標(biāo)區(qū)域在裁減范圍內(nèi),繪制成功

canvas.drawRect(200, 200, 700, 700, mPaint);
mPaint.setColor(Color.GRAY);
canvas.drawRect(200, 800, 700, 1300, mPaint);
canvas.clipOutRect(200, 200, 700, 700); //效果2 畫布裁減外的區(qū)域有效
canvas.drawCircle(100, 100, 100, mPaint); //坐標(biāo)區(qū)域在裁減范圍外,繪制成功
canvas.drawCircle(300, 300, 100, mPaint); //坐標(biāo)區(qū)域在裁剪區(qū)域內(nèi),無法繪制
切割效果1

切割效果2

2.2.6 矩陣Matrix

canvas.drawRect(0, 0, 700, 700, mPaint);
Matrix matrix = new Matrix();
matrix.setTranslate(50, 50); //同translate效果1
matrix.setRotate(45);
matrix.setScale(0.5f, 0.5f);
canvas.Matrix(matrix); //效果1
mPaint.setColor(Color.GRAY);
canvas.drawRect(0, 0, 700, 700, mPaint);

2.3 狀態(tài)保存和恢復(fù)

Canvas調(diào)用了translate,scale,rotate,skew,clipRect等變換后,后續(xù)的操作都是基于變換后的Canvas,都會受到影響,杜宇后續(xù)的操作很不方便。為此,Canvas提供了save,saveLayer,saveLayerAlpha,restore,restoreToCount來保存和恢復(fù)狀態(tài)。

2.3.1 save restore

canvas.drawRect(200, 200, 700, 700, mPaint);
canvas.save(); //不用考慮save之后的變形,在適當(dāng)時機(jī)restore即可恢復(fù)canvas坐標(biāo)系狀態(tài)
canvas.translate(50, 50);

mPaint.setColor(Color.GRAY);
canvas.drawRect(0, 0, 500, 500, mPaint);
canvas.restore(); //可多次調(diào)用,每次返回到上一個save的狀態(tài),但調(diào)用次數(shù)多于save次數(shù)則會報錯
//canvas.getSaveCount()可獲取,默認(rèn)為1,save加1,restore減1
//canvas.restoreToCount(int state)返回到某個狀態(tài),int state = canvas.save();
canvas.drawLine(0, 0, 400, 500, mPaint);



int layerId = canvas.saveLayer(0, 0, 700, 700, mPaint);
mPaint.setColor(Color.GRAY);
Matrix matrix = new Matrix();
matrix.setTranslate(100, 100);
canvas.setMatrix(matrix);
//由于平移操作,導(dǎo)致繪制的矩形超出了圖層的大小,所以繪制不完全
canvas.drawRect(0, 0, 700, 700, mPaint); 

canvas.restoreToCount(layerId);
mPaint.setColor(Color.RED);
canvas.drawRect(0, 0, 100, 100, mPaint);
狀態(tài)保存效果1

狀態(tài)保存效果2

例:1.粒子爆炸效果 2.旋轉(zhuǎn)擴(kuò)散水波紋效果

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

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

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