Android实现3D旋转效果

下面的示例是在Android中实现图片3D旋转的效果。

 

实现3D效果一般使用OpenGL,但在Android平台下可以不直接使用OpenGL,而是使用Camera实现,Camera中原理最终还是使用OpenGL,不过使用Camera比较方便。 Camera类似一个摄像机,当物体不动时,我们带着摄像机四处移动,在摄像机里面的画面就会有立体感,就可以从其它的角度观看这个物体。废话不多说,直接看示例。

 

运行效果如下: 

   

   

 

项目结构:

 

MainView.java中代码:

复制代码
package com.android.graphics;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Camera;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public  class MainView  extends View{
      // Camera类
      private Camera mCamera;
     
      private Bitmap face; 
      private Matrix mMatrix =  new Matrix();
      private Paint mPaint =  new Paint();

      private  int mLastMotionX, mLastMotionY;
     
      // 图片旋转时的中心点坐标
      private  int centerX, centerY;
      // 转动的总距离,跟度数比例1:1
      private  int deltaX, deltaY;
      // 图片宽度高度
      private  int bWidth, bHeight;
     
      public MainView(Context context,AttributeSet attributeSet) {
       super(context,attributeSet);
      setWillNotDraw( false);
      mCamera =  new Camera(); 
      mPaint.setAntiAlias( true);
      face = BitmapFactory.decodeResource(getResources(), R.drawable.x);
      bWidth = face.getWidth();
      bHeight = face.getHeight();
      centerX = bWidth>>1;
      centerY = bHeight>>1;
     } 
     
      void rotate( int degreeX,  int degreeY) {
      deltaX += degreeX;
      deltaY += degreeY;
      
      mCamera.save();
      mCamera.rotateY(deltaX);
      mCamera.rotateX(-deltaY);
      mCamera.translate(0, 0, -centerX);
      mCamera.getMatrix(mMatrix);
      mCamera.restore(); 
      
       // 以图片的中心点为旋转中心,如果不加这两句,就是以(0,0)点为旋转中心
      mMatrix.preTranslate(-centerX, -centerY);
      mMatrix.postTranslate(centerX, centerY);  
      mCamera.save(); 
      
      postInvalidate();
     } 
     
     @Override
      public  boolean onTouchEvent(MotionEvent event) {
       int x = ( int) event.getX();
       int y = ( int) event.getY();
      
       switch(event.getAction()) {
       case MotionEvent.ACTION_DOWN:
       mLastMotionX = x;
       mLastMotionY = y;
        break;
       case MotionEvent.ACTION_MOVE:
        int dx = x - mLastMotionX;
        int dy = y - mLastMotionY;
       rotate(dx, dy);
       mLastMotionX = x;
       mLastMotionY = y;
        break;
       case MotionEvent.ACTION_UP:
        break;
      }
       return  true;
     }
     
     @Override
      public  void dispatchDraw(Canvas canvas) {
       super.dispatchDraw(canvas);
      canvas.drawBitmap(face, mMatrix, mPaint);  
     }

复制代码

 

main.xml中代码:

复制代码
<? xml version="1.0" encoding="utf-8" ?>
< LinearLayout  xmlns:android ="http://schemas.android.com/apk/res/android"
    android:orientation
="vertical"
    android:layout_width
="fill_parent"
    android:layout_height
="fill_parent"
    
>
  < com.android.graphics.MainView
    
android:id ="@+id/cv"
    android:layout_width
="fill_parent"  
    android:layout_height
="wrap_content"  
 
/> 

</LinearLayout>  

复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值