本節(jié)引言:
1.translate(平移)
使用示例: for(int i=0; i < 5; i++) { canvas.drawCircle(50, 50, 50, mPaint); canvas.translate(100, 100); }運(yùn)行效果:
2.rotate(旋轉(zhuǎn))
使用示例: Rect rect = new Rect(50,0,150,50); canvas.translate(200, 200); for(int i = 0; i < 36;i++){ canvas.rotate(10); canvas.drawRect(rect, mPaint); } 運(yùn)行效果: 代碼分析: 這里我們先調(diào)用了translate(200,,200)將canvas的坐標(biāo)原點(diǎn)移向了(200,200),,再進(jìn)行繪制,所以我們 繪制的結(jié)果可以完整的在畫布上顯示出來(lái),,假如我們是為rotate設(shè)置了(10,200,200),,會(huì)是這樣一個(gè) 結(jié)果: 有疑問(wèn)是吧,這個(gè)涉及到Canvas多圖層的概念,,等等會(huì)講~ 3.scale(縮放)
使用示例: canvas.drawBitmap(bmp,0,0,mPaint); canvas.scale(0.8f, 0.8f); canvas.drawBitmap(bmp, 0, 0, mPaint); canvas.scale(0.8f, 0.8f); canvas.drawBitmap(bmp,0,0,mPaint); 運(yùn)行效果: 4.skew(傾斜)
使用示例: canvas.drawBitmap(bmp,0,0,mPaint); canvas.translate(200, 200); canvas.skew(0.2f,-0.8f); canvas.drawBitmap(bmp,0,0,mPaint); 運(yùn)行效果: 5.Canvas圖層的概念以及save()和restore()詳解
寫個(gè)例子: 例子代碼: canvas.save(); //保存當(dāng)前canvas的狀態(tài) canvas.translate(100, 100); canvas.drawCircle(50, 50, 50, mPaint); canvas.restore(); //恢復(fù)保存的Canvas的狀態(tài) canvas.drawCircle(50, 50, 50, mPaint); 運(yùn)行結(jié)果: 不用說(shuō)什么了吧,,代碼和結(jié)果已經(jīng)說(shuō)明了一切,接著我們搞得復(fù)雜點(diǎn),,來(lái)一發(fā) 多個(gè)save()和restore(),! 例子代碼: canvas.save(); canvas.translate(300, 300); canvas.drawBitmap(bmp, 0, 0, mPaint); canvas.save(); canvas.rotate(45); canvas.drawBitmap(bmp, 0, 0, mPaint); canvas.save(); canvas.rotate(45); canvas.drawBitmap(bmp, 0, 0, mPaint); canvas.save(); canvas.translate(0, 200); canvas.drawBitmap(bmp, 0, 0, mPaint); 運(yùn)行結(jié)果: 結(jié)果分析: 首先平移(300,300)畫圖,然后旋轉(zhuǎn)45度畫圖,,再接著旋轉(zhuǎn)45度畫圖,,接著平移(0,200), 期間每次畫圖前都save()一下,,看到這里你可能有個(gè)疑問(wèn),,最后這個(gè)平移不是y移動(dòng)200 么,怎么變成向左了,?嘿嘿,,我會(huì)告訴你rotate()旋轉(zhuǎn)的是整個(gè)坐標(biāo)軸么?坐標(biāo)軸的 變化: 嗯,,rotate()弄懂了是吧,,那就行,接著我們來(lái)試試restore咯~我們?cè)谧詈罄L圖的前面 加兩個(gè)restore(),! canvas.restore(); canvas.restore(); canvas.translate(0, 200); canvas.drawBitmap(bmp, 0, 0, mPaint); 運(yùn)行結(jié)果: 不說(shuō)什么,,自己體會(huì),再加多個(gè)restore(),! 有點(diǎn)意思,,再來(lái),繼續(xù)加restore() 嗯,,好像不可以再寫restore了是吧,,因?yàn)槲覀冎籹ave了四次,按照網(wǎng)上的說(shuō)法,, 這會(huì)報(bào)錯(cuò)的,,真的是這樣嗎?這里我們調(diào)用Canvas給我們提供的一個(gè)獲得當(dāng)前棧中 有多少個(gè)Layer的方法:getSaveCount(),;然后在save()和restore()的前后都 加一個(gè)Log將棧中Layer的層數(shù)打印出來(lái): 結(jié)果真是喜聞樂(lè)見(jiàn),,畢竟實(shí)踐出真知,可能是Canvas改過(guò)吧,,或者其他原因,,這里 要看源碼才知道了,時(shí)間關(guān)系,,這里我們知道下restore的次數(shù)可以比save多就好了,, 但是還是建議restore的次數(shù)還是少于save,,以避免造成不必要的問(wèn)題~ 至于進(jìn)棧和出棧的流程我就不話了,筆者自己動(dòng)筆畫畫,,非常容易理解,! 6.saveLayer()與restoreToCount()講解
PS:上述說(shuō)明有點(diǎn)問(wèn)題,筆者英語(yǔ)水平低,,可能說(shuō)錯(cuò),,如果有知道的,請(qǐng)務(wù)必指正提出,,謝謝~ 這里我們寫個(gè)例子來(lái)驗(yàn)證下:我們選用CLIP_TO_LAYER_SAVE_FLAG模式來(lái)寫個(gè)例子 實(shí)現(xiàn)代碼: RectF bounds = new RectF(0, 0, 400, 400); canvas.saveLayer(bounds, mPaint, Canvas.CLIP_TO_LAYER_SAVE_FLAG); canvas.drawColor(getResources().getColor(R.color.moss_tide)); canvas.drawBitmap(bmp, 200, 200, mPaint); canvas.restoreToCount(1); canvas.drawBitmap(bmp, 300, 200, mPaint); 運(yùn)行結(jié)果: 關(guān)于saveLayer()后面用到再詳解研究吧~這里先知道個(gè)大概~ 接著到這個(gè)restoreToCount(int),,這個(gè)更簡(jiǎn)單,直接傳入要恢復(fù)到的Layer層數(shù),, 直接就跳到對(duì)應(yīng)的那一層,,同時(shí)會(huì)將該層上面所有的Layer踢出棧,讓該層 成為棧頂~,!比起你寫多個(gè)restore()方便快捷多了~ 7.本節(jié)代碼示例下載:嗯,,代碼是寫著測(cè)試的,要來(lái)也沒(méi)多大意思,,不過(guò)可能讀者還是想要,,就貼下鏈接吧! 代碼下載:CanvasDemo.zip 可能你們要的是這個(gè)圖吧,!哈哈~
本節(jié)小結(jié):
參考文獻(xiàn): AndroidのCanvasを使いこなす! – 基本的な描畫 |
|
來(lái)自: 小飛苑 > 《android基礎(chǔ)》