日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android里面画布快照,自定义 View - Canvas - 画布操作和快照

發(fā)布時(shí)間:2024/10/12 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android里面画布快照,自定义 View - Canvas - 画布操作和快照 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

操作

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。