最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2013年02月21日 15:35:38   作者:  
Camera主要實現(xiàn)3D的變形,有轉(zhuǎn)動,旋轉(zhuǎn)等,Camera的源碼是由Native(本地代碼)實現(xiàn),提供的接口也比較簡單,感興趣的朋友可以參考下,或許對你學(xué)習(xí)有所幫助

引言

Android變形(Transform)之Matrix,來總結(jié)下Camera的使用,Camera主要實現(xiàn)3D的變形,有轉(zhuǎn)動,旋轉(zhuǎn)等,Camera的源碼是由Native(本地代碼)實現(xiàn),提供的接口也比較簡單。官方的介紹: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:保存當前狀態(tài)

restore:回復(fù)當前狀態(tài)

translate:在x,y,z三位控件內(nèi)進行平移 

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

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

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

...

常用的就這么多

實踐

直接上代碼:

復(fù)制代碼 代碼如下:

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中就用到了該方法做些額外的處理,下面具體看看:
復(fù)制代碼 代碼如下:

@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的時候不進行倆行設(shè)置的話,可以看到效果如下:

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

復(fù)制代碼 代碼如下:

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

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

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

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

1,0,-centerX                     1,0,centerX

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

0,0,1                               0,0,1

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

回顧

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

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

pre可以解釋為先乘,在矩陣原理中對應(yīng)的右乘

post可以理解成后乘,在矩陣遠離中對應(yīng)左乘

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

舉個例子:

原圖

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

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

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

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

照例來說對應(yīng)矩陣為:

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

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

2,0,-50

0,2,-50,

0,0,1

好,揭曉下疑點:

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

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

那么正確的矩陣算法應(yīng)該為

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來實現(xiàn)中心點的設(shè)置。

相關(guān)文章

  • android判斷設(shè)備是否有相機的實例代碼

    android判斷設(shè)備是否有相機的實例代碼

    下面小編就為大家?guī)硪黄猘ndroid判斷設(shè)備是否有相機的實例代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • A10_DatePicker的對話框設(shè)置(使用OnDateSetListener監(jiān)聽器)

    A10_DatePicker的對話框設(shè)置(使用OnDateSetListener監(jiān)聽器)

    本文主要彌補A07_TimePicker & DatePicker & AnalogClock & DigitalClock 的設(shè)置,具體實現(xiàn)代碼如下,感興趣的朋友可以參考下哈
    2013-06-06
  • 如何解決android Toast重復(fù)顯示

    如何解決android Toast重復(fù)顯示

    Toast是一種簡易的消息提示框,它無法獲取焦點,按設(shè)置的時間來顯示完以后會自動消失,一般用于幫助或提示,本文給大家介紹android Toast重復(fù)顯示的解決辦法,涉及到android toast 相關(guān)知識,有需要的朋友參考下
    2016-01-01
  • Android微信自動搶紅包插件優(yōu)化和實現(xiàn)

    Android微信自動搶紅包插件優(yōu)化和實現(xiàn)

    這篇文章主要為大家詳細介紹了Android微信自動搶紅包插件優(yōu)化和實現(xiàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Android中的Choreographer工作原理解析

    Android中的Choreographer工作原理解析

    Choreographer作為Android系統(tǒng)中重要的組件,負責協(xié)調(diào)App進程的UI渲染與SurfaceFlinger進程的數(shù)據(jù)合成,本文詳細分析了Choreographer的創(chuàng)建流程、VSYNC信號的調(diào)度和處理機制,揭示了其在UI渲染過程中的核心作用
    2024-10-10
  • Android照片墻應(yīng)用實現(xiàn) 再多的圖片也不怕崩潰

    Android照片墻應(yīng)用實現(xiàn) 再多的圖片也不怕崩潰

    這篇文章主要為大家詳細介紹了Android照片墻應(yīng)用實現(xiàn),再多的圖片也不怕崩潰,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 關(guān)于Android中drawable必知的一些規(guī)則

    關(guān)于Android中drawable必知的一些規(guī)則

    drawable這個東西相信大家天天都在使用,每個Android開發(fā)者都再熟悉不過了,但可能還有一些你所不知道的規(guī)則,那今天我們就來一起探究一下這些規(guī)則。
    2016-08-08
  • Android自定義View之漸變色折線圖的實現(xiàn)

    Android自定義View之漸變色折線圖的實現(xiàn)

    折線圖的實現(xiàn)方法在github上有很多開源的程序,但是對于初學(xué)者來講,簡單一點的教程可能更容易入門,下面這篇文章主要給大家介紹了關(guān)于Android自定義View之漸變色折線圖的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • Android使用TouchDelegate增加View的觸摸范圍

    Android使用TouchDelegate增加View的觸摸范圍

    這篇文章主要為大家詳細介紹了Android使用TouchDelegate增加View的觸摸范圍,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Android Flutter實現(xiàn)仿閑魚動畫效果

    Android Flutter實現(xiàn)仿閑魚動畫效果

    目前正在做的項目,為了增加用戶的體驗度,準備增加一些動畫效果。本文將通過Android Flutter實現(xiàn)仿閑魚動畫效果,感興趣的可以嘗試一下
    2023-02-02

最新評論

土默特左旗| 山西省| 兰考县| 东阳市| 普格县| 资阳市| 特克斯县| 安丘市| 隆安县| 浦县| 霍城县| 南昌县| 东至县| 衢州市| 保德县| 昌平区| 磐石市| 宁夏| 龙泉市| 长丰县| 北宁市| 连南| 焉耆| 达孜县| 元阳县| 咸宁市| 建昌县| 额济纳旗| 敖汉旗| 太白县| 湘潭县| 满城县| 砚山县| 新田县| 凌海市| 攀枝花市| 淳安县| 祁连县| 许昌市| 泉州市| 饶阳县|