請尊重原創(chuàng)咐汞,轉載請注明出處【tianyl】的博客
1. 前言
前面簡單描述了一下Canvas的基礎用法涮雷,還有一個和Canvas不怎么相關的Region矛市,接下來疗琉,就通過一個例子簡單說說Canvas中的坐標變換(也就是常見的平移价淌、旋轉活玲、縮放等)和坐標變換中使用到的save和restore。
2. Canvas變換
說到Canvas的變換袜匿,首先就要介紹Canvas的坐標系更啄,再使用Canvas時,我們要知道2個坐標系居灯,一個是Canvas的坐標系祭务,一個是繪圖的坐標系。
- Canvas坐標系
我們知道怪嫌,Android系統(tǒng)中有一個坐標系义锥,它以屏幕的左上角為原點,向右為X軸正半軸岩灭,向下為Y軸正半軸拌倍,出了Android系統(tǒng)的坐標系,對于一個Canvas噪径,它也有自己的坐標系柱恤,原點就是View的左上角,從坐標原點往右是X軸正半軸找爱,往下是Y軸的正半軸梗顺,有且僅有一個,它是唯一不變的车摄。
- 繪圖坐標系
在使用Canvas時寺谤,除了需要知道Canvas坐標系仑鸥,還需要知道繪圖坐標系,當然繪圖坐標系它是可變的变屁,它和Canvas的Matrix相關眼俊,Matrix改變時,繪圖坐標系會對應的改變敞贡,這個過程不可逆泵琳,但是可以通過save和restore來進行操作,Matrix又是通過translate(平移)誊役、rotate(旋轉)获列、scale(縮放)和skew(錯切)來修改。
3. Canvas的save和saveLayer
介紹完Canvas的坐標系蛔垢,接下來說說一般情況下這些坐標系的用法击孩。
save
之前說了,Canvas的坐標系是可以通過平移旋轉進行改變的鹏漆,所以當我們想要有平移前的狀態(tài)和平移后的狀態(tài)巩梢,那么我們可以通過save來將這兩種狀態(tài)保存起來,而save保存的狀態(tài)可以用restore恢復艺玲,當然括蝠,save和restore相當于是一次入棧和出棧的操作,一次save對應一次restore饭聚。saveLayer
說完了save忌警,再來說說saveLayer,saveLayer從方法字面意思看秒梳,就是保存一個圖層法绵,它其實和PS里的圖層.
4. 例子
下面就通過一個簡單例子,來對Canvas的坐標變換進行說明.
//先通過canvas.translate操作Canvas的繪圖坐標系酪碘,操作操作后的繪圖坐標系原點處于操作前(100朋譬,100)的位置
canvas.translate(100, 100);
mPaint.setColor(Color.BLUE);
//以坐標(100,100)的位置為原點兴垦,繪制一個半徑100的圓徙赢,因為坐標系已經平移過了,所以這個原點其實是沒平移前的(200探越,200)
canvas.drawCircle(100, 100, 100, mPaint);
canvas.save();
mPaint.setColor(Color.YELLOW);
canvas.drawCircle(200, 200, 100, mPaint);
//再次平移
canvas.translate(400, 0);
mPaint.setColor(Color.BLUE);
canvas.drawCircle(100, 100, 100, mPaint);
//這里使用了saveLayer狡赐,并且傳入的參數0x7f其實是50%的透明度,也就是對接下來要入棧了一個圖層扶关,并且之后在這個圖層上畫的圖像阴汇,進行了半透明的處理
canvas.saveLayerAlpha(0, 0, 300, 300, 0x7f, Canvas.ALL_SAVE_FLAG);
mPaint.setColor(Color.YELLOW);
canvas.drawCircle(200, 200, 100, mPaint);
canvas.restore();
canvas.restore();
具體效果如下:
左邊的是使用save的效果数冬,右邊的是使用saveLayer的效果节槐,這個方法就是在我們繪制圖像的時候搀庶,可以繪制在多個圖層上,然后針對不同的圖層實現自己想要的效果铜异。
5. 結尾
關于Canvas的的各種變換效果哥倔,因為網上已經很很多例子了,所以本著不重復造輪子的精神揍庄,這里僅對這些效果進行概括性的說明咆蒿。