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

首頁 > 系統 > Android > 正文

Android變形(Transform)之Camera使用介紹

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

引言

Android變形(Transform)之Matrix,來總結下Camera的使用,Camera主要實現3D的變形,有轉動,旋轉等,Camera的源碼是由Native(本地代碼)實現,提供的接口也比較簡單。官方的介紹:A camera instance can be used to compute 3D transformations and generate a matrix that can be applied, for instance, on a  Canvas.

效果圖

原圖:

 

變形以后:

 

API使用 

Camera提供的方法如下:

save:保存當前狀態

restore:回復當前狀態

translate:在x,y,z三位控件內進行平移 

rotateX:以(0.0)為中心,繞X軸進行選擇

rotateY:以(0.0)為中心,繞Y軸進行選擇

rotateZ:以(0.0)為中心,旋轉(此處和Matrix旋轉原理一樣,只不過反向相反,為逆時針)

...

常用的就這么多

實踐

直接上代碼:

復制代碼 代碼如下:

public class CameraTransformView extends View {

private Bitmap mBitmap;
private Camera mCamera;
private Matrix mMatrix;
private int deltaX, deltaY, deltaZ, extraZ;
private int centerX, centerY;

public CameraTransformView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public void setDrawable(int resId) {
mBitmap = BitmapFactory.decodeResource(getResources(), resId);
centerX = mBitmap.getWidth() / 2;
centerY = mBitmap.getHeight() / 2;
mCamera = new Camera();
mMatrix = new Matrix();
}

public void setDelta(int x, int y, int z, int extra) {
deltaX += x;
deltaY += y;
deltaZ += z;
extraZ += extra;
invalidate();
}

public void reset() {
deltaX = 0;
deltaY = 0;
deltaZ = 0;
invalidate();
}

@Override
protected void onDraw(Canvas canvas) {
mCamera.save();
mCamera.translate(10, 10, extraZ);
mCamera.rotateX(deltaX);
mCamera.rotateY(deltaY);
mCamera.rotateZ(deltaZ);
mCamera.getMatrix(mMatrix);
mCamera.restore();

mMatrix.preTranslate(-this.centerX, -this.centerY);
mMatrix.postTranslate(this.centerX, this.centerY);

canvas.drawBitmap(mBitmap, mMatrix, null);
super.onDraw(canvas);
}

}

其實Camera的變化就是封裝了一個Matrix矩陣,可以通過getMatrix方法來獲取這個坐標矩陣。在上面的Demo中就用到了該方法做些額外的處理,下面具體看看:
復制代碼 代碼如下:

@Override
protected void onDraw(Canvas canvas) {
mCamera.save();
mCamera.translate(10, 10, extraZ);
mCamera.rotateX(deltaX);
mCamera.rotateY(deltaY);
mCamera.rotateZ(deltaZ);
mCamera.getMatrix(mMatrix);
mCamera.restore();

//mMatrix.preTranslate(-this.centerX, -this.centerY);
//mMatrix.postTranslate(this.centerX, this.centerY);

canvas.drawBitmap(mBitmap, mMatrix, null);
super.onDraw(canvas);
}

在onDraw方法中,可以通過Camera的方法來完成變形。注意11,12行,如果在onDraw的時候不進行倆行設置的話,可以看到效果如下:

可以看到,其按照Y軸旋轉中心點是(0,0),那么平常的應用而言,大多希望其中心點在圖片的中心點上。所以需要加入

復制代碼 代碼如下:

mMatrix.preTranslate(-this.centerX, -this.centerY);
mMatrix.postTranslate(this.centerX, this.centerY);

其實這一節的重點就在于剖析這倆句話。

從Camara的API中可以看出來其不提供變形中心點的設置方法,那么怎么辦呢,基本思路是:假設圖片中心點為(centerX,centerY),既然Camera始終以(0,0)為中心點,那么我先將圖形矩陣往左移動centerX,再往上移動centerY,讓(centerX,centerY)正好掐在初始的(0,0)上,這樣進行變形的話,中心點就變成了(centerX,centerY),達到了目的,當然這還沒結束,你既然偏移了(-centerX,-centerY),那么變形以后得移回來,然后再往右下方分別移動centerX,centerY。

按照矩陣的變換,可以表達為:

1,0,-centerX                     1,0,centerX

0,1,-centerY  * 變形矩陣 *  0,1,centerY

0,0,1                               0,0,1

那么具體就如此,思路和代碼結合起來怎么來解釋呢,接著看,我們需要回顧下Matrix中的部分知識。

回顧

Matrix提供的三種變形方式為:set,post,pre。

set就是先reset,然后進行變形

pre可以解釋為先乘,在矩陣原理中對應的右乘

post可以理解成后乘,在矩陣遠離中對應左乘

不著急,接下倆具體看什么是先乘,后乘,什么是左乘,右乘。

舉個例子:

原圖

讓一個圖形按照中心點放大至2倍

那么期望的效果是:中心點不變(圖片被邊緣截斷了)

那么按照之前提高的思路:假設中心點是(50,50)先左上移50,也即(-50,-50)再進行放大,再右下移50,也即(50,50)

api調用即為:setScale(2,2), preTranslate(-50,-50), postTranslate(50,50)

照例來說對應矩陣為:

1,0,-50       2,0,0       1,0,50        2,0,50

0,1,-50   *  0,0,2   *  0,1,50    =  0,2,50

0,0,1          0,0,1       0,0,1          0,0,1

可以看到結果是放大至2倍,但是卻往右下移動了(50,50),奇怪要是這樣的話,和預期的效果圖一樣預期的效果圖矩陣應該為(方法至2倍,往左上移動(-50,-50))

2,0,-50

0,2,-50,

0,0,1

好,揭曉下疑點:

此處api的執行順序為:preTranslate(-50,-50)  ->  setScale(2,2)  ->  postTranslate(50,50) 沒有問題

答案揭曉:矩陣符合變化的原則,如果圖形經過F1,F2...Fn此變形,對應矩陣為T1,T2...Tn,符合矩陣T = Tn*Tn-1...*T1

那么正確的矩陣算法應該為

1,0,50       2,0,0       1,0,-50        2,0,-50

0,1,50   *  0,0,2   *  0,1,-50    =  0,2,-50

0,0,1          0,0,1       0,0,1          0,0,1

此處也解釋了pre為右乘,post為左乘的原理了。

那么到此為止,一切都都得到了解釋。

回歸

回歸到Camera的Demo當中,既然Camera的變形中心點是(0,0),而且Camera的變形實際是對Matrix的變形,我們可以通過getMatrix方法來獲取這個Matrix,然后通過左移pre,變形后右移post來實現中心點的設置。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲视频电影图片偷拍一区| 欧美性xxxxxxx| 狠狠综合久久av一区二区小说| 亚洲一区二区三区乱码aⅴ蜜桃女| 搡老女人一区二区三区视频tv| 不卡毛片在线看| 久久久久久久色| 久久久精品国产亚洲| 国产啪精品视频| 成人97在线观看视频| 久久视频在线观看免费| 亚洲国产美女精品久久久久∴| 国产成人av在线| 欧美丰满少妇xxxxx做受| 欧美大片va欧美在线播放| 成人羞羞国产免费| 国产91露脸中文字幕在线| 亚洲精品日韩在线| 国产精品欧美风情| 欧美日韩另类在线| 亚洲成人精品av| 亚洲美女动态图120秒| 亚洲天堂开心观看| 亚洲香蕉av在线一区二区三区| 欧美成人第一页| 国色天香2019中文字幕在线观看| 国产福利成人在线| 尤物精品国产第一福利三区| 欧美有码在线观看| 亚洲欧美日韩天堂一区二区| 国外视频精品毛片| 国产精品女人久久久久久| 日本精品va在线观看| 久久精品视频va| 日韩av片永久免费网站| 日韩激情第一页| 久久免费少妇高潮久久精品99| 日韩福利视频在线观看| 成人做爽爽免费视频| 久久久国产精品免费| 国产日韩亚洲欧美| 国语自产在线不卡| 精品亚洲一区二区三区在线观看| 2019最新中文字幕| 国产精品18久久久久久麻辣| 久久国产色av| 国产精品国产三级国产aⅴ浪潮| 亚洲www永久成人夜色| 久久精品国产成人精品| 色悠久久久久综合先锋影音下载| 久久久www成人免费精品张筱雨| 亚洲精品综合久久中文字幕| 日韩中文字幕精品| 国产女精品视频网站免费| 国产亚洲欧洲高清| 欧美中文在线观看国产| 国模私拍视频一区| 国产精品男女猛烈高潮激情| 久久精品2019中文字幕| 久久久成人精品视频| 亚洲高清不卡av| 岛国av在线不卡| 中文字幕欧美日韩精品| 国产精品亚洲综合天堂夜夜| 亚洲精品日产aⅴ| 日韩国产精品亚洲а∨天堂免| 91国内免费在线视频| 日本亚洲精品在线观看| 亚洲午夜av电影| 亚洲欧洲日本专区| 国产福利成人在线| 国产精品啪视频| 在线成人免费网站| 欧美日本精品在线| 国产一区二区三区久久精品| 日韩av中文字幕在线免费观看| 国产精品久久久久久久午夜| 欧美成人午夜免费视在线看片| 久久99国产精品自在自在app| 日韩精品中文字幕在线播放| 久久亚洲精品毛片| 精品久久久久久久久久久久久| 亚洲人成电影在线观看天堂色| 欧美日韩国产综合视频在线观看中文| 久久精品99久久久香蕉| 欧美极度另类性三渗透| 国产精品爽黄69| 亚洲第一中文字幕在线观看| 欧美黑人一区二区三区| 亚洲精品自拍偷拍| 九九视频直播综合网| 欧美日韩国产影院| 亚洲欧美一区二区三区在线| 国产精品久久久久久久7电影| 久久久免费精品| 日韩av综合中文字幕| 日本精品视频在线播放| 欧美区二区三区| 欧美一级黑人aaaaaaa做受| 久久91精品国产91久久久| 成人h猎奇视频网站| 国产欧美va欧美va香蕉在线| 欧美综合在线第二页| 日本久久亚洲电影| 久久久成人的性感天堂| 久久久这里只有精品视频| 91精品国产91久久久久久吃药| 日韩视频第一页| 欧美精品免费在线观看| 精品久久久久久亚洲国产300| 日韩av免费看网站| 日本亚洲欧美成人| 国产成人精彩在线视频九色| 最新69国产成人精品视频免费| 欧美激情a∨在线视频播放| 久久亚洲春色中文字幕| 91在线观看免费高清完整版在线观看| 久久精品国产久精国产一老狼| 精品久久久久久中文字幕大豆网| 日韩欧美在线看| 欧美激情免费在线| 亚洲三级av在线| 欧美午夜精品久久久久久浪潮| 亚洲国产成人精品一区二区| 亲爱的老师9免费观看全集电视剧| 国产午夜精品理论片a级探花| 亚洲va欧美va国产综合剧情| 亚洲成人av在线播放| 5566日本婷婷色中文字幕97| 日韩欧美在线观看视频| 亚洲国产91精品在线观看| 9.1国产丝袜在线观看| 91午夜在线播放| 国产欧美久久一区二区| 日韩在线精品一区| 亚洲人在线视频| 国产婷婷成人久久av免费高清| 91精品国产乱码久久久久久久久| 国产精品一区二区三区在线播放| 欧美成人一区在线| 亚洲成人黄色在线观看| 欧美一级免费看| 亚洲视频欧美视频| 日韩麻豆第一页| 亚洲另类图片色| 欧美激情一区二区三级高清视频| 亚洲国产成人一区| 国产视频在线一区二区| 国产精品网红福利| 亚洲欧美在线免费| 97高清免费视频| 欧美在线国产精品| 一本色道久久综合狠狠躁篇的优点| 91精品国产免费久久久久久| 福利一区福利二区微拍刺激| 欧美精品中文字幕一区| 一区二区欧美激情| 日韩视频在线免费| 欧美野外wwwxxx| 精品国产区一区二区三区在线观看| 日韩中文字幕在线视频播放| 日韩av片免费在线观看| 91在线高清视频| 亚洲成人精品久久久|