亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android變形(Transform)之Matrix用法

2020-04-11 12:31:40
字體:
來源:轉載
供稿:網友

引言

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

效果圖

變形以后

 

Matrix矩陣

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

圖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直接變形,而非我上面講的那種。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97香蕉超级碰碰久久免费的优势| 中文字幕亚洲欧美日韩2019| 亚洲人精品午夜在线观看| 欧美综合第一页| 欧美成人午夜影院| 国产精品亚洲综合天堂夜夜| 日韩电影在线观看中文字幕| 欧美高清视频免费观看| 久久久久国色av免费观看性色| 亚洲第一av网站| 91精品久久久久久久久久另类| 色综合老司机第九色激情| 青青在线视频一区二区三区| 亚洲国产精品久久久久秋霞不卡| 国产欧美在线看| 亚洲成人av在线播放| 精品福利在线看| 久久久久久这里只有精品| 亚洲第一中文字幕在线观看| 91精品在线观看视频| 久久韩剧网电视剧| 国产精品jvid在线观看蜜臀| 国内精品一区二区三区四区| 色婷婷综合成人| 91免费的视频在线播放| 午夜精品久久久久久99热| 亚洲午夜久久久久久久| 亚洲国产精品福利| 国产91精品久久久| 国产亚洲成av人片在线观看桃| 亚洲精品中文字| 欧洲美女7788成人免费视频| 亚洲第一色在线| 黄色一区二区在线观看| 国产精品久久一区| 亚洲欧美三级在线| 欧美日韩国产999| 欧美午夜电影在线| 欧美丰满少妇xxxxx| 色婷婷av一区二区三区在线观看| 亚洲第一精品久久忘忧草社区| 精品亚洲永久免费精品| 久久成人精品视频| 中文字幕欧美精品在线| 国产日韩视频在线观看| 色噜噜狠狠色综合网图区| 97视频人免费观看| 国产日韩在线视频| 中文字幕自拍vr一区二区三区| 日韩中文字幕国产精品| 美女少妇精品视频| 亚洲一级黄色片| 国产99久久精品一区二区永久免费| 欧美激情精品久久久| 亚洲国产精品成人va在线观看| 国产区精品视频| 欧美激情一级精品国产| 欧美在线激情网| 欧美精品www| 92版电视剧仙鹤神针在线观看| 日本午夜精品理论片a级appf发布| 亚洲国产精品成人va在线观看| 69视频在线播放| 国产成人免费av电影| 亚洲tv在线观看| 日韩一区视频在线| 日韩av中文在线| 亚洲美女视频网站| 国语自产偷拍精品视频偷| 色妞欧美日韩在线| 中文字幕日韩欧美在线视频| 国产亚洲一区二区在线| 欧美美最猛性xxxxxx| 精品一区二区亚洲| 亚洲免费高清视频| 欧美日韩国产va另类| 久久久欧美一区二区| 亚洲免费福利视频| 欧美中文在线观看| 国产精品久久久久久久午夜| 欧美亚洲另类在线| 欧美在线视频免费观看| 欧美成人四级hd版| 国产99久久精品一区二区| 午夜精品久久久99热福利| 日韩有码在线播放| 97婷婷大伊香蕉精品视频| 亚洲国产日韩欧美在线99| 中文字幕日韩欧美| 日本老师69xxx| 成人福利在线视频| 国产精品免费看久久久香蕉| 欧美激情视频在线| 国产精品88a∨| 日韩中文字在线| 91精品国产777在线观看| 国产一区二区黑人欧美xxxx| 日韩电影中文 亚洲精品乱码| 欧美视频免费在线| 中文字幕成人精品久久不卡| 26uuu国产精品视频| 久久精品国产一区| 琪琪第一精品导航| 2019日本中文字幕| 久久精品视频在线观看| 亚洲一级黄色片| 日韩国产高清污视频在线观看| 成人在线免费观看视视频| 欧美在线观看视频| 国产精品一区二区三区成人| 国产精品视频午夜| 98精品国产高清在线xxxx天堂| 欧美日韩福利电影| 91精品国产高清久久久久久91| 国产成+人+综合+亚洲欧美丁香花| 亚洲欧美一区二区三区四区| 精品久久久久久久久久久久久久| 久久久久久久久久久久久久久久久久av| 久久国产精品久久久久久| 亚洲一区二区三区在线免费观看| 久久久久亚洲精品成人网小说| 久久躁狠狠躁夜夜爽| 91av在线精品| 欧美性猛交xxxx富婆弯腰| 国产精品www网站| 川上优av一区二区线观看| 日韩国产精品视频| 久久成人精品一区二区三区| 97久久超碰福利国产精品…| 国产一区二区三区四区福利| 日本成人精品在线| 亚洲黄色av网站| 亚洲午夜精品久久久久久久久久久久| 国产精品视频yy9099| 日韩经典中文字幕在线观看| 色与欲影视天天看综合网| 欧美极品美女视频网站在线观看免费| 91免费人成网站在线观看18| 亚洲性xxxx| 国产精品白丝av嫩草影院| 欧美精品中文字幕一区| 成人福利网站在线观看11| 国产亚洲日本欧美韩国| 亚洲成av人乱码色午夜| 91亚洲精品一区二区| 国产丝袜一区二区三区免费视频| 国产日韩精品在线播放| 欧美华人在线视频| 中文字幕日本精品| 91久久精品国产91久久性色| 国产成人avxxxxx在线看| 国产精品久久一区主播| 日本精品一区二区三区在线播放视频| 91免费福利视频| 日韩中文在线中文网在线观看| 欧美日韩激情网| 1769国产精品| 国产综合在线观看视频| 91精品国产777在线观看| 91黄色8090| 欧美日韩国产丝袜另类| 亚洲自拍小视频免费观看| 在线观看成人黄色| 国产精品露脸av在线|