Android的3D旋转

来源:互联网 发布:上海快3遗漏数据查询 编辑:程序博客网 时间:2024/05/14 16:56

点击打开链接:http://chroya.iteye.com/blog/828094

Android的3D旋转

    博客分类: 
  • Android
AndroidUPBlog

       见过没有用opengl的3D动画,看了一下,是用的Camera实现的,内部机制实际上还是opengl,不过大大简化了使用。
       Camera就像一个摄像机,一个物体在原地不动,然后我们带着这个摄像机四处移动,在摄像机里面呈现出来的画面,就会有立体感,就可以从各个角度观看这个物体。
        它有旋转、平移的一系列方法,实际上都是在改变一个Matrix对象,一系列操作完毕之后,我们得到这个Matrix,然后画我们的物体,就可以了。


        常用的API如下:

    rotateX(float degree)  绕着x轴旋转degree个度数
    rotateY(float degree)  绕着y轴旋转degree个度数
    rotateZ(float degree)  绕着z轴旋转degree个度数
    translate(float x,float y,float z)  平移一段距离
    save()和restore()  作用跟Canvas的一样,保存原状态,操作完之后,恢复到原状态。


        下面实现一个简单的图片三维翻转的效果。

Java代码  收藏代码
  1. package chroya.demo.rotate3d;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.BitmapFactory;  
  6. import android.graphics.Camera;  
  7. import android.graphics.Canvas;  
  8. import android.graphics.Matrix;  
  9. import android.graphics.Paint;  
  10. import android.view.MotionEvent;  
  11. import android.view.View;  
  12.   
  13. /** 
  14.  * 图片三维翻转 
  15.  * @author chroya 
  16.  */  
  17. public class CubeView extends View {  
  18.     //摄像机  
  19.     private Camera mCamera;  
  20.       
  21.     //翻转用的图片  
  22.     private Bitmap face;      
  23.     private Matrix mMatrix = new Matrix();  
  24.     private Paint mPaint = new Paint();  
  25.   
  26.     private int mLastMotionX, mLastMotionY;  
  27.       
  28.     //图片的中心点坐标  
  29.     private int centerX, centerY;  
  30.     //转动的总距离,跟度数比例1:1  
  31.     private int deltaX, deltaY;  
  32.     //图片宽度高度  
  33.     private int bWidth, bHeight;  
  34.       
  35.     public CubeView(Context context) {  
  36.         super(context);  
  37.         setWillNotDraw(false);  
  38.         mCamera = new Camera();   
  39.         mPaint.setAntiAlias(true);  
  40.         face = BitmapFactory.decodeResource(getResources(), R.drawable.x);  
  41.         bWidth = face.getWidth();  
  42.         bHeight = face.getHeight();  
  43.         centerX = bWidth>>1;  
  44.         centerY = bHeight>>1;  
  45.     }     
  46.       
  47.     /** 
  48.      * 转动 
  49.      * @param degreeX 
  50.      * @param degreeY 
  51.      */  
  52.     void rotate(int degreeX, int degreeY) {  
  53.         deltaX += degreeX;  
  54.         deltaY += degreeY;  
  55.           
  56.         mCamera.save();  
  57.         mCamera.rotateY(deltaX);  
  58.         mCamera.rotateX(-deltaY);  
  59.         mCamera.translate(00, -centerX);  
  60.         mCamera.getMatrix(mMatrix);  
  61.         mCamera.restore();    
  62.         //以图片的中心点为旋转中心,如果不加这两句,就是以(0,0)点为旋转中心  
  63.         mMatrix.preTranslate(-centerX, -centerY);  
  64.         mMatrix.postTranslate(centerX, centerY);          
  65.         mCamera.save();   
  66.           
  67.         postInvalidate();  
  68.     }     
  69.       
  70.     @Override  
  71.     public boolean onTouchEvent(MotionEvent event) {  
  72.         int x = (int) event.getX();  
  73.         int y = (int) event.getY();  
  74.           
  75.         switch(event.getAction()) {  
  76.         case MotionEvent.ACTION_DOWN:  
  77.             mLastMotionX = x;  
  78.             mLastMotionY = y;  
  79.             break;  
  80.         case MotionEvent.ACTION_MOVE:  
  81.             int dx = x - mLastMotionX;  
  82.             int dy = y - mLastMotionY;  
  83.             rotate(dx, dy);  
  84.             mLastMotionX = x;  
  85.             mLastMotionY = y;  
  86.             break;  
  87.         case MotionEvent.ACTION_UP:  
  88.             break;  
  89.         }  
  90.         return true;  
  91.     }  
  92.       
  93.     @Override  
  94.     public void dispatchDraw(Canvas canvas) {  
  95.         super.dispatchDraw(canvas);  
  96.         canvas.drawBitmap(face, mMatrix, mPaint);         
  97.     }  
  98. }  

         注释里面都写的比较清楚了。

         效果如下:

 

 

       可以touch来拖动图片以翻转。这个可以用来做很多事情,比如桌面的立体翻转、立体相册等等。

原创粉丝点击