激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Android - Android變形(Transform)之Matrix用法

Android變形(Transform)之Matrix用法

2021-01-07 14:51Android開發網 Android

Android的2D變形(包括縮放,扭曲,平移,旋轉等)可以通過Matrix來實現,本文研究了一下;接下來就將我這倆天研究的東西和大家分享下,先來看看Matrix的用法感興趣的你可不要錯過了哈

引言

最近在研究android的變形,android的2d變形(包括縮放,扭曲,平移,旋轉等)可以通過matrix來實現,3d變形可以通過camera來實現。接下來就將我這倆天研究的東西和大家分享下,先來看看matrix的用法。

效果圖

Android變形(Transform)之Matrix用法

變形以后

Android變形(Transform)之Matrix用法Android變形(Transform)之Matrix用法

matrix矩陣

坐標變換矩陣,即一個3*3的矩陣,用來對圖形進行坐標變換。

Android變形(Transform)之Matrix用法

圖1.1  a為坐標矩陣,c為原始矩陣,r是a和c矩陣相乘記過,那么可以知道:(矩陣知識,大學沒學好的傷不起啊)

x' = a*x + b*y + c

y' = d*x + b*y + f

最后一列很少有資料提到,不過初始值g=h=0,大家可以去改變值試試,變化為3d效果,但是值沒看出規律,那么i為縮放比例,初始值為1。

初始化坐標矩陣為{1,0,0,   0,1,0,   0,0,1}

上面講到的是基本的算法,那么具體這個矩陣x行x列的值代表上面呢,不防簡單的來看看

如果a={1,0,100,  0,1,-100,  0,0,2},那么可以算出來

x' = x + 100;

y' = y - 100;

也即在原始的基礎上右移100,上移100,單位為像素。第三列第三行為2,表示為以前比例的1/2,記住這塊容易弄錯。

下面給出具體坐標對應變形的屬性

|scalex, skewx, translatex| 

|skewy, scaley, translatey|

|0       ,0        , scale       |

實踐

通過代碼來看看具體的用法

復制代碼 代碼如下:

public class matrixtransformview extends view {

private matrix mmatrix;
private paint mpaint = new paint(paint.anti_alias_flag);
private bitmap mbitmap;

public matrixtransformview(context context) {
super(context);
}

public matrixtransformview(context context, attributeset attrs) {
super(context, attrs);
}

public void setdrawable(int resid) {
mbitmap = bitmapfactory.decoderesource(getcontext().getresources(), resid);
}

/*
* 設置矩陣,并重繪
*/
public void setmatrixvalues(float[] array) {
if (mmatrix == null) {
mmatrix = new matrix();
}
mmatrix.reset();
mmatrix.setvalues(array);
invalidate();
}

public void resetmatrix() {
if (mmatrix != null) {
mmatrix.reset();
}
invalidate();
}

@override
protected void ondraw(canvas canvas) {
if (mmatrix != null) {
paint paint = mpaint;
canvas.drawbitmap(mbitmap, mmatrix, paint);
}

super.ondraw(canvas);
}
}


通過matrix的setvalues方法,將3*3的矩陣坐標值進行設置即可。

 

強調的一點是,在調用setmatrixvalues的時候需要調用invalidate方法,讓view進行調用ondraw進行重繪。

矩陣的基本用法就是這些,往往在開發過程中,不直接通過矩陣坐標去實現變形,因為如果要實現選擇,那么就比較復雜了,涉及到三角函數,對于數據早已經忘差不多的人,很是痛苦,當然如果非要用的話,算起來也不難。

那么為了避免直接使用矩陣坐標來操作變形,matrix類提供方法來進行變:

set方式:setscale, setskew, settranslate, setrotate

post方式:postscale, postskew, posttranslate, postrotate

pre方式:prescale, preskew, pretranslate, prerotate

set方式為直接設置,每一次調用set方法都會先重置矩陣。post可以理解成設置多次有效,效果是累加的。pre這里暫且理解成和post方式完全一樣,后面3d的時候再糾結。

看代碼:

復制代碼 代碼如下:

public class matrixtransformview extends view {

private matrix mmatrix;
private paint mpaint = new paint(paint.anti_alias_flag);
private bitmap mbitmap;

public matrixtransformview(context context) {
super(context);
}

public matrixtransformview(context context, attributeset attrs) {
super(context, attrs);
}

public void setdrawable(int resid) {
mbitmap = bitmapfactory.decoderesource(getcontext().getresources(), resid);
}

/*
* 設置矩陣,并重繪
*/
public void setmatrixvalues(float[] array) {
if (mmatrix == null) {
mmatrix = new matrix();
}
mmatrix.reset();
mmatrix.setvalues(array);
invalidate();
}

public void postmatrixscale(float scalex, float scaley, float centerx, float centery) {
if (mmatrix == null) {
mmatrix = new matrix();
}
mmatrix.prescale(scalex, scaley, centerx, centery);
invalidate();
}

public void postmatrixskew(float skewx, float skewy, float centerx, float centery) {
if (mmatrix == null) {
mmatrix = new matrix();
}
mmatrix.postskew(skewx, skewy, centerx, centery);
invalidate();
}

public void postmatrixtranslate(float translatex, float translatey) {
if (mmatrix == null) {
mmatrix = new matrix();
}
mmatrix.posttranslate(translatex, translatey);
invalidate();
}

public void postmatrixrotate(float degree, float centerx, float centery) {
if (mmatrix == null) {
mmatrix = new matrix();
}
mmatrix.postrotate(degree, centerx, centery);
invalidate();
}

public void resetmatrix() {
if (mmatrix != null) {
mmatrix.reset();
}
invalidate();
}

@override
protected void ondraw(canvas canvas) {
if (mmatrix != null) {
paint paint = mpaint;
canvas.drawbitmap(mbitmap, mmatrix, paint);
}

super.ondraw(canvas);
}
}


matrix的基本用法就這么多。

 

擴展

變形是需要canvas來進行繪制的,canvas的繪制需要bitmap,所以這塊利用一個繼承自view的控件,通過setdrawable方式設置bitmap,那么選擇目標必須是個bitmap,在文章的demo中,通過參數為int型resource的setdrawable方法進行bitmap獲取,如果想對別的控件進行變形,例如viewgroup,可以通過如下方式:

復制代碼 代碼如下:

matrix m = new matrix();
m.setvalues(new float[] {
1, 0, 0,
0, 1, 0,
0, 0, 1
});
bitmap bp = bitmap.createbitmap(viewgroup.getwidth(), viewgroup.getheight(), bitmap.config.rgb_565);
canvas can = new canvas(bp);
viewgroup.draw(can);
bp = bitmap.createbitmap(bp, 0, 0, bp.getwidth(), bp.getheight(), m, true);
img.setimagebitmap(bp);


通過將viewgroup轉換成bitmap,然后自定義一個image來變形,隱藏viewgroup來達到效果。

 

疑問

1.如果誰知道post,pre的區別,請告訴我下,看看我的理解是否正確。

2.能否實現viewgroup直接變形,而非我上面講的那種。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 国产一区免费视频 | 国产成人免费高清激情视频 | 成人免费福利视频 | 小雪奶水翁胀公吸小说最新章节 | 久久久综合视频 | 99riav视频一区二区 | 欧美日本亚洲视频 | 91成人免费在线观看 | 久久99精品久久久久久久久久久久 | 亚洲第九十九页 | 亚洲国产精品久久久久久久 | 日本不卡一区二区三区在线 | 国产一区二区视频网站 | 亚洲白嫩在线观看 | 鲁久久 | 欧美成人一区在线观看 | 久久欧美亚洲另类专区91大神 | 久久精品欧美电影 | 国产99久久久久久免费看农村 | 国产资源在线视频 | 亚洲精品无码不卡在线播放he | 久久人人做 | 成人免费在线视频播放 | 久久综合一区 | 亚洲精品a级| 一区二区三区在线观看免费视频 | 在线播放黄色网址 | 国产精品久久久久久影视 | 中文字幕1区2区 | 黄色av网站在线观看 | 在线日韩 | 欧美日韩免费看 | 午夜小电影 | 伊人手机在线观看 | 欧美视频一区二区三区在线观看 | 久久蜜臀一区二区三区av | 在线成人免费观看 | 国产成人77亚洲精品www | 爽爽淫人综合网网站 | 国产精品99久久久久久宅女 | 99精彩视频在线观看 |