Android实现3D旋转效果
生活随笔
收集整理的這篇文章主要介紹了
Android实现3D旋转效果
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
下面的示例是在Android中實現(xiàn)圖片3D旋轉(zhuǎn)的效果。
?
實現(xiàn)3D效果一般使用OpenGL,但在Android平臺下可以不直接使用OpenGL,而是使用Camera實現(xiàn),Camera中原理最終還是使用OpenGL,不過使用Camera比較方便。?Camera類似一個攝像機,當物體不動時,我們帶著攝像機四處移動,在攝像機里面的畫面就會有立體感,就可以從其它的角度觀看這個物體。廢話不多說,直接看示例。
?
運行效果如下:?
???
???
?
項目結(jié)構(gòu):
?
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;
?????
?????//圖片旋轉(zhuǎn)時的中心點坐標
?????private?int?centerX,?centerY;
?????//轉(zhuǎn)動的總距離,跟度數(shù)比例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();?
??????
??????//以圖片的中心點為旋轉(zhuǎn)中心,如果不加這兩句,就是以(0,0)點為旋轉(zhuǎn)中心
??????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>??
最后,希望轉(zhuǎn)載的朋友能夠尊重作者的勞動成果,加上轉(zhuǎn)載地址:http://www.cnblogs.com/hanyonglu/archive/2012/02/12/2347636.html??謝謝。
?
完畢。^_^?
總結(jié)
以上是生活随笔為你收集整理的Android实现3D旋转效果的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 孕早期做梦梦到蛇是怎么回事
- 下一篇: 梦到毒蛇预示着什么周公解梦