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