Android編程實現3D旋轉效果執行個體_Android

來源:互聯網
上載者:User

本文執行個體講述了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>

希望本文所述對大家Android程式設計有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.