android里面画布快照,自定义 View - Canvas - 画布操作和快照
操作
API
備注
移動(dòng)畫布
translate(float dx, float dy)
--
畫布旋轉(zhuǎn)
rotate(float degrees)
--
畫布旋轉(zhuǎn)
rotate(float degrees, float px, float py)
--
畫布縮放
scale(float sx, float sy)
--
畫布縮放
scale(float sx, float sy, float px, float py)
--
畫布錯(cuò)切
skew(float sx, float sy)
--
畫布狀態(tài)保存
save()
--
畫布狀態(tài)保存
save(int saveFlags)
API26棄用
畫布狀態(tài)還原
restore()
--
畫布狀態(tài)還原
restore(int saveCount)
--
一、畫布移動(dòng)
操作
API
備注
移動(dòng)畫布
translate(float dx, float dy)
--
畫布移動(dòng)操作在繪制自定義 View 中非常常用,它能減少不必要的計(jì)算,同時(shí)讓我們?cè)诶L制的時(shí)候,只需要關(guān)注某個(gè)小模塊的內(nèi)部位置關(guān)系。思路清晰了,做自定義自然也會(huì)得心應(yīng)手一些。
上面方法意為把畫布中心移動(dòng)到某個(gè)位置 (dx, dy),在移動(dòng)的時(shí)候,畫布上已經(jīng)繪制的視圖并不會(huì)移動(dòng)。下面是我移動(dòng)了兩次的例子:
canvas.translate(50,50);
drawXY(canvas);//繪制坐標(biāo)系
canvas.translate(350,250)
drawXY(canvas);//繪制坐標(biāo)系
效果圖-g.png
二、旋轉(zhuǎn)
操作
API
備注
畫布旋轉(zhuǎn)
rotate(float degrees)
--
畫布旋轉(zhuǎn)
rotate(float degrees, float px, float py)
--
參數(shù)是旋轉(zhuǎn)角度和旋轉(zhuǎn)中心,在沒有旋轉(zhuǎn)中心參數(shù)傳入的時(shí)候,默認(rèn)旋轉(zhuǎn)中心為 (0 , 0) 。需要注意的是,由于屏幕的坐標(biāo)系 y 軸向下,所以轉(zhuǎn)動(dòng)的正方向和習(xí)慣的有些不同。
三、縮放
操作
API
備注
畫布縮放
scale(float sx, float sy)
--
畫布縮放
scale(float sx, float sy, float px, float py)
--
scale 方法中主要看前面兩個(gè)參數(shù),后面兩個(gè)參數(shù)為旋轉(zhuǎn)中心,在不輸入值的時(shí)候,默認(rèn)為(0 , 0)。
degree 取值
備注
(1, +∞)
放大
1
不變
(0, 1)
縮小
(-1, 0)
縮小并翻轉(zhuǎn) 180
-1
翻轉(zhuǎn) 180
(-∞, -1)
放大并翻轉(zhuǎn) 180
這個(gè)東西讓我想到了高中時(shí)候做的小孔成像實(shí)驗(yàn)。。。
言歸正傳,寫點(diǎn)代碼更容易理解,先是正值 0.5、1.0、1.5、2.0 的效果圖:
效果圖-g.png
再來是負(fù)值 -0.5、-1.0、-1.5、-2.0 的效果圖:
效果圖-g.png
defree 絕對(duì)值取值
備注
(1, +∞)
放大
1
不變
(0, 1)
縮小
然后我發(fā)現(xiàn),對(duì)于 scale 來說,我們需要記住下面的表格
defree 絕對(duì)值取值
備注
(1, +∞)
放大
1
不變
(0, 1)
縮小
關(guān)于正負(fù)翻轉(zhuǎn)多少,其實(shí)可以參考坐標(biāo)系里象限的相關(guān)知識(shí),大概是這樣:
效果圖-g.png
隱約記起了自己背 “奇變偶不變,符號(hào)看象限” 的日子。
四、錯(cuò)切
操作
API
備注
畫布錯(cuò)切
skew(float sx, float sy)
--
錯(cuò)切只提供了一種方法,兩個(gè)參數(shù)為:
sx 畫布在 x 軸上的傾斜角度的 tan 值
sy 畫布在 y 軸上的傾斜角度的 tan 值
在轉(zhuǎn)換后,會(huì)給每個(gè)點(diǎn)計(jì)算出新的位置,具體計(jì)算方法為:
xResult = x + sy * x
yResult = y + sx * y
試了一下 x 軸上 45 度的錯(cuò)切:
效果圖-g.png
五、畫布快照
操作
API
備注
畫布狀態(tài)保存
save()
--
畫布狀態(tài)保存
save(int saveFlags)
API26棄用
畫布狀態(tài)還原
restore()
--
畫布狀態(tài)還原
restore(int saveCount)
--
為什么要有畫布快照這個(gè)功能?這個(gè)功能有什么用?
如果大家已經(jīng)試過位移、旋轉(zhuǎn)等操作,你們有可能發(fā)現(xiàn),如果我連續(xù)兩次進(jìn)行操作,第一次畫布旋轉(zhuǎn) 90 繪制一個(gè)矩形,第二次畫布旋轉(zhuǎn) 180 繪制一個(gè)矩形。得到的結(jié)果是這樣的:
效果圖-g.png
我們發(fā)現(xiàn)第二次旋轉(zhuǎn) 180 繪制的圖形,實(shí)際上旋轉(zhuǎn)了 270。這是因?yàn)槲覀兯械牟僮魇钳B加的,并不會(huì)自動(dòng)歸位。這樣對(duì)于簡(jiǎn)單操作來說,還是可以的,但是如果操作方式變得比較復(fù)雜,無疑會(huì)增加我們的工作量。
所以,我們需要屏幕快照來保存當(dāng)前畫布的狀態(tài),當(dāng)繪制完成后,返回到原來的畫布狀態(tài)。
canvas.translate(originX,originY);
RectF rectF = new RectF(0, 0, 200, 200);
mRectPaint.setColor(Color.BLACK);
canvas.drawRect(rectF,mRectPaint);
canvas.save();
mRectPaint.setColor(Color.RED);
canvas.rotate(90);
canvas.drawRect(rectF,mRectPaint);
canvas.restore();
canvas.save();
mRectPaint.setColor(Color.GREEN);
canvas.rotate(180);
canvas.drawRect(rectF,mRectPaint);
canvas.restore();
效果圖-g.png
需要注意的是,我們可以 save 次數(shù)大于 restore,但是 restore 的次數(shù)不能多于 save 次數(shù),否則會(huì)出錯(cuò)。
關(guān)于畫布操作中的位移、縮放、旋轉(zhuǎn)、錯(cuò)切,其實(shí)都是對(duì)于 Matric 的封裝。如果想了解這方面的東西,可以簡(jiǎn)單看看下面的文章。希望你的線性代數(shù)沒有忘光。
謝謝觀賞
總結(jié)
以上是生活随笔為你收集整理的android里面画布快照,自定义 View - Canvas - 画布操作和快照的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最低工资标准包含哪些
- 下一篇: e语言html显示框,html marg