国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看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 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 黄色片视频免费 | 成人性大片免费观看网站 | 午夜在线小视频 | 天天干天天骑 | 色综合久久一区二区三区 | 欧美一区二区在线观看视频 | 在线播放一区二区三区 | 一级特黄毛片 | 伊人久久综合 | 久久99精品国产99久久6尤 | 欧美透逼视频 | 成人激情在线 | 自拍偷拍亚洲 | 国产精品成人一区二区三区 | 中文字幕在线观看视频一区 | 91精品久久久久久久久久 | 成年人免费在线播放视频 | 福利久久 | 激情五月激情综合网 | 午夜精品久久久久久久男人的天堂 | 欧美激情一区二区三级高清视频 | 色综合天天综合网国产成人网 | 国产成人在线一区 | 天天干夜夜操 | 99久久婷婷国产综合精品电影 | 国产精品自产拍在线观看桃花 | 欧美精品久久久久 | 欧美日韩综合在线 | 欧美综合在线观看 | 三级黄色片在线免费观看 | 亚洲电影第三页 | 国产成人免费在线 | 欧美福利在线观看 | 九九热在线视频观看这里只有精品 | 韩国精品一区二区三区 | 成人精品鲁一区一区二区 | 国产精品永久免费视频 | 欧美一区二区三区的 | 欧洲美女性开放视频 | 国产精品香蕉在线观看 | 日韩成人一级片 |