1. 程式人生 > >Android APIDemos 研讀之二:android.graphics.Camera 源文地址 : http://blog.csdn.net/sharetop/article/details/5277655

Android APIDemos 研讀之二:android.graphics.Camera 源文地址 : http://blog.csdn.net/sharetop/article/details/5277655

        Android APIDemos 研讀之二:android.graphics.Camera     

源文地址 : http://blog.csdn.net/sharetop/article/details/5277655

  

分類:            Android
11028人閱讀 評論(4) 收藏 舉報 android matrix null 圖形 手機 c


此Camera非彼Camera,在android.graphics包裡的Camera,可以理解為2D圖形系統中的視角,或者照相機的機位,根據透視的原理我們可以實現一些簡單的3D效果。

在ApiDemo中可參考那個Rotate3dAnimation例子。

其實Camera就兩個方法:translate和rotate,下面逐一探討一番吧。

程式碼很簡單,做一個小小的自定義View來做試驗罷了。我引入的這張圖片尺寸是480*600(因為手機是480*854)。

[java] view plain copy print ?
  1. protected void onDraw(Canvas canvas) { 
  2.             canvas.drawColor(0xFFCCCCCC);    
  3.             
  4.             //Log.d(TAG,"bit w "+bitmap.getWidth()+",h "+bitmap.getHeight()); 
  5.             
  6.             Paint paint = new Paint(); 
  7.             paint.setColor(Color.DKGRAY); 
  8.             paint.setStrokeWidth(2.0f); 
  9.             paint.setStyle(Paint.Style.STROKE); 
  10.             
  11.             canvas.drawLine(0, 600, 480, 600, paint); 
  12.             for(int i=0;50*i<600;i++) 
  13.                 canvas.drawLine(0, 50*i, 480, 50*i, paint); 
  14.             for(int i=0;50*i<480;i++) 
  15.                 canvas.drawLine(50*i, 0, 50*i, 600, paint); 
  16.             
  17.             
  18.             Matrix matrix = new Matrix(); 
  19.             
  20.             Camera c = new Camera(); 
  21.             c.save(); 
  22.             
  23.             //機位的正向轉動引起圖片向螢幕裡翻轉 
  24.             //但是繞Z軸的轉動,引起圖片平面的旋轉(2D效果) 
  25.             c.rotateZ(45); 
  26.             
  27.             //X引起圖片向右移動50(正向朝右) 
  28.             //Y引起圖片向上移動50(正向朝上) 
  29.             //Z引起圖片縮小(正向指向自己) 
  30.             c.translate(100f, 0f, 300f); 
  31.             c.getMatrix(matrix); 
  32.             //c.applyToCanvas(canvas); 
  33.             
  34.             c.restore(); 
  35.             
  36.         //移到中心點上 
  37.             matrix.preTranslate(-240, -300); 
  38.             matrix.postTranslate(240, 300); 
  39.             
  40.             canvas.concat(matrix); 
  41.             
  42.             canvas.drawBitmap(bitmap, 0,0,null); 
  43.             //canvas.drawBitmap(bitmap, matrix, null); 
  44.             
  45.             
  46.         } 
  47.     } 


通過實驗可知:

translate(x,y,z),很好理解,見程式碼中的註釋。座標軸似乎與我們常規的理解不一樣?為什麼會這樣呢?
rotateX,rotateY,rotateZ,也很好理解,機位的移動,對圖片的影響正好是反向的。

最後要注意的是有兩種方法應用這個機位的修改,效果也不一樣,說不清,您可以自己嘗試一下。

主題推薦
android 移動 bitmap 圖片 手機
猜你在找
Android ApiDemos 學習 Graphics-SensorTest
Android ApiDemos示例解析54Graphics-BitmapDecode
androidgraphicsCamera圖片繞XYZ軸旋轉
Android ApiDemos示例解析205Graphics-OpenGL ES-Translucent GLSurfaceView
Android ApiDemos示例解析201Graphics-OpenGL ES-Compressed Texture
Android ApiDemos示例解析75Graphics-PurgeableBitmap
Android ApiDemos示例解析204Graphics-OpenGL ES-Frame Buffer Object
Android ApiDemos示例解析77Graphics-RoundRects
Android ApiDemos示例解析59Graphics-ColorFilters
Android ApiDemos示例解析82Graphics-TouchPaint
檢視評論
3樓 perrypong 2012-05-28 22:58發表[回覆] [引用] [舉報]
為何圖改成X軸轉時, 約60度, 圖就消失?
2樓 Lotuslovenature 2011-02-15 14:05發表[回覆] [引用] [舉報]
Thanks for sharing!
1樓 匿名使用者 2010-03-03 15:52發表[回覆] [引用] [舉報]
你好!  你的程式碼我試了一下,但是無法實現你所說的效果。可以將詳細些的程式碼貼出來嗎。或者麻煩發我郵箱可以嗎?  [email protected] 謝謝!


此Camera非彼Camera,在android.graphics包裡的Camera,可以理解為2D圖形系統中的視角,或者照相機的機位,根據透視的原理我們可以實現一些簡單的3D效果。

在ApiDemo中可參考那個Rotate3dAnimation例子。

其實Camera就兩個方法:translate和rotate,下面逐一探討一番吧。

程式碼很簡單,做一個小小的自定義View來做試驗罷了。我引入的這張圖片尺寸是480*600(因為手機是480*854)。

[java] view plain copy print ?
  1. protected void onDraw(Canvas canvas) { 
  2.             canvas.drawColor(0xFFCCCCCC);    
  3.             
  4.             //Log.d(TAG,"bit w "+bitmap.getWidth()+",h "+bitmap.getHeight()); 
  5.             
  6.             Paint paint = new Paint(); 
  7.             paint.setColor(Color.DKGRAY); 
  8.             paint.setStrokeWidth(2.0f); 
  9.             paint.setStyle(Paint.Style.STROKE); 
  10.             
  11.             canvas.drawLine(0, 600, 480, 600, paint); 
  12.             for(int i=0;50*i<600;i++) 
  13.                 canvas.drawLine(0, 50*i, 480, 50*i, paint); 
  14.             for(int i=0;50*i<480;i++) 
  15.                 canvas.drawLine(50*i, 0, 50*i, 600, paint); 
  16.             
  17.             
  18.             Matrix matrix = new Matrix(); 
  19.             
  20.             Camera c = new Camera(); 
  21.             c.save(); 
  22.             
  23.             //機位的正向轉動引起圖片向螢幕裡翻轉 
  24.             //但是繞Z軸的轉動,引起圖片平面的旋轉(2D效果) 
  25.             c.rotateZ(45); 
  26.             
  27.             //X引起圖片向右移動50(正向朝右) 
  28.             //Y引起圖片向上移動50(正向朝上) 
  29.             //Z引起圖片縮小(正向指向自己) 
  30.             c.translate(100f, 0f, 300f); 
  31.             c.getMatrix(matrix); 
  32.             //c.applyToCanvas(canvas); 
  33.             
  34.             c.restore(); 
  35.             
  36.         //移到中心點上 
  37.             matrix.preTranslate(-240, -300); 
  38.             matrix.postTranslate(240, 300); 
  39.             
  40.             canvas.concat(matrix); 
  41.             
  42.             canvas.drawBitmap(bitmap, 0,0,null); 
  43.             //canvas.drawBitmap(bitmap, matrix, null); 
  44.             
  45.             
  46.         } 
  47.     } 


通過實驗可知:

translate(x,y,z),很好理解,見程式碼中的註釋。座標軸似乎與我們常規的理解不一樣?為什麼會這樣呢?
rotateX,rotateY,rotateZ,也很好理解,機位的移動,對圖片的影響正好是反向的。

最後要注意的是有兩種方法應用這個機位的修改,效果也不一樣,說不清,您可以自己嘗試一下。