`
chroya
  • 浏览: 661490 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android的3D旋转

阅读更多

       见过没有用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的一样,保存原状态,操作完之后,恢复到原状态。


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

package chroya.demo.rotate3d;

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.view.MotionEvent;
import android.view.View;

/**
 * 图片三维翻转
 * @author chroya
 */
public class CubeView extends View {
	//摄像机
	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 CubeView(Context context) {
		super(context);
		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;
	}	
	
	/**
	 * 转动
	 * @param degreeX
	 * @param degreeY
	 */
	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);		
	}
}

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

         效果如下:

 

 

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

       源码也附上,见附件。

14
1
分享到:
评论
14 楼 yangmaolinpl 2013-06-19  
楼主,小弟学习了。
13 楼 alexlikeask 2012-07-03  
好东东,学习啦!
12 楼 libo19881179 2011-11-21  
学习了 lz辛苦
11 楼 xiandaoyan 2011-08-07  
拜读了啊!
10 楼 chroya 2011-03-11  
jackson604 写道
可以不可绕着Y轴进行立体旋转呢?

mCamera.rotateY(d);就是绕着y轴进行旋转
9 楼 jackson604 2011-03-10  
可以不可绕着Y轴进行立体旋转呢?
8 楼 chroya 2011-01-15  
jebe7282 写道
mCamera.translate(0, 0, -centerX); 

博主 这句话能否解释一下呢。

这个标示镜头在Z轴方向上的移动,正值是垂直屏幕向外,负值是垂直屏幕向里。
7 楼 jebe7282 2011-01-15  
mCamera.translate(0, 0, -centerX); 

博主 这句话能否解释一下呢。
6 楼 jebe7282 2011-01-15  
mCamera.translate(0, 0, -centerX); 

博主 这句话能否解释一下呢。
5 楼 Coding.Ghost 2010-12-12  
貌似锯齿是不可避免的.只是能通过某个方法减弱锯齿.
4 楼 chroya 2010-12-07  
hellorheaven 写道
楼主你好。
有几个问题请教呵,

1.        mCamera.save();   mCamera.restore();
分别是什么意思呵?
2.        我自定义动画实现旋转倾斜效果,不过总是有锯齿,用paint的方式效果不是很好,在bitmap哪边是在调用不到canvas的消锯齿的方法,请问还有什么好的方法或思路么?

1.save()和restore()是必须成对使用的方法,save()的作用是,保存当前的画布状态,restore()就是将画布状态恢复到save之前的状态。在save()之后对canvas的任何操作都会在restore()之后无效,但是画布上的内容还在。  不知道你明白没。
2.抗锯齿,目前来说我知道的只有两种方法,见http://chroya.iteye.com/blog/794505
3 楼 hellorheaven 2010-12-06  
楼主你好。
有几个问题请教呵,

1.        mCamera.save();   mCamera.restore();
分别是什么意思呵?
2.        我自定义动画实现旋转倾斜效果,不过总是有锯齿,用paint的方式效果不是很好,在bitmap哪边是在调用不到canvas的消锯齿的方法,请问还有什么好的方法或思路么?
2 楼 chroya 2010-12-05  
kdale 写道
楼主给个apk包啊,省得我再编译了

哥哥哎,您老可真懂得懒之精髓。 好吧,apk也放上去。
1 楼 kdale 2010-12-05  
楼主给个apk包啊,省得我再编译了

相关推荐

    android3D旋转图片

    在"android3D旋转图片"的实例中,我们可能首先需要创建一个ImageView或自定义视图来显示图片,并准备一个Matrix对象来存储变换信息。然后,我们可以使用`Matrix.setRotate()`方法设置旋转角度,这个方法会更新矩阵以...

    android 3D旋转相册

    在Android平台上,开发3D旋转相册是一种提升用户体验和视觉效果的高级技术。"android 3D旋转相册"指的是利用Android SDK中的图形库和动画API来创建一个具有立体感和动态旋转效果的图片浏览应用。这样的相册不仅能够...

    android 3D旋转屏幕实现,直接解压

    在Android开发中,3D旋转屏幕的实现是一个高级特性,它可以为用户带来更生动、更具交互性的体验。本文将深入探讨如何在Android中实现在不同轴上的3D旋转效果,并结合"Rotate3D"这个文件名,我们可以推断这是一个与3D...

    Android 3D圆形旋转菜单

    Android 3D圆形旋转菜单Android 3D圆形旋转菜单Android 3D圆形旋转菜单Android 3D圆形旋转菜单Android 3D圆形旋转菜单Android 3D圆形旋转菜单Android 3D圆形旋转菜单Android 3D圆形旋转菜单

    android 3D 旋转效果

    在Android开发中,3D旋转效果是一种常见的动画技术,它能为用户界面带来生动和立体的感受,提升用户体验。本文将深入探讨如何在Android平台上实现3D旋转效果,并结合`MyRorateViewTest`这个示例项目进行讲解。 一、...

    Android 3D 旋转

    在Android开发中,3D旋转是一种常见的动画效果,可以为用户界面增添丰富的视觉体验。"Android 3D 旋转"通常涉及到OpenGL ES、View动画、属性动画等技术,用于实现类似《Dota2》选择服务器界面那样的立体动态展示。...

    android 3D旋转效果控件

    在Android开发中,3D旋转效果控件是一种增强用户界面体验的重要技术,它能为应用程序带来生动、立体的视觉效果。3D旋转通常涉及到视图的转换和动画,通过使用Android提供的视图动画API或者属性动画API来实现。本文将...

    Android-3D自动旋转的旋转木马

    在本项目中,我们将会探讨如何实现这样一个3D旋转木马的效果。 首先,我们要理解3D旋转的核心概念——`OpenGL ES`。OpenGL ES是Android系统中用于进行2D和3D图形渲染的库,它允许开发者创建复杂的视觉效果。在这个...

    android 3D坐标旋转

    要实现3D旋转,我们需要使用`Matrix`类,它是Android提供的数学矩阵工具类,用于处理几何变换。例如,可以使用`Matrix.setRotateM()`方法来设置旋转矩阵,参数包括旋转中心点、旋转角度以及旋转轴。这里,旋转中心点...

    Android自定义动画 3D旋转

    3D旋转是Android动画库中的一种高级技巧,通过它可以创建出逼真的立体旋转效果,为用户带来更丰富的视觉体验。 在Android中,自定义动画主要包括两种类型:属性动画(Property Animation)和视图动画(View ...

    Android 3D 旋转立方体

    实现自动旋转的渐变色立方体

    android-opengl图片3d旋转

    本文将深入探讨如何使用OpenGL ES在Android上实现图片的3D旋转。 首先,理解OpenGL ES的基本概念至关重要。OpenGL ES是OpenGL的一个子集,专为嵌入式系统设计,如智能手机和平板电脑。它提供了一个离散的图形编程...

    Android 随手势进行3D旋转的源码-IT计算机-毕业设计.zip

    "Android 随手势进行3D旋转的源码"是一个典型的项目,它结合了这两个方面,旨在帮助学生进行毕业设计学习。这个项目可能包含了一系列的类、XML布局文件以及相关的资源文件,用于实现用户手势控制下的3D对象旋转效果...

    Android 3D旋转动画效果(Animation扩展)

    主要介绍一下如何实现View的3D旋转效果,实现的主要原理就是围绕Y轴旋转,同时在Z轴方面上有一个深入的缩放。 演示的demo主要有以下几个重点: 1,自定义旋转动画 2,动画做完后,重置ImageView

    Android代码-3d旋转切换view

    1、支持3d旋转。 2、支持自定义旋转。 3、点击3d切换,触摸滑动3d切换 配置view 布局xml里: 代码设置: mLoopRotarySwitchView .setR(300)//设置R的大小 .setAutoRotation(true)//是否自动切换 ....

    android canvas 3D旋转木马 图片立体展示

    总的来说,"android canvas 3D旋转木马 图片立体展示"是一个结合了Android图形编程、动画技术和用户交互的复杂项目。它需要开发者具备扎实的数学基础、良好的编程技巧以及对Android系统理解的深度。通过学习和实践这...

    Android 3D旋转动画效果实现分解

    这篇文章主要介绍一下如何实现View的3D旋转效果,实现的主要原理就是围绕Y轴旋转,同时在Z轴方面上有一个深入的缩放。演示的demo主要有以下几个重点: 1,自定义旋转动画 2,动画做完后,重置ImageView 先看一下程序...

    Android 3D View旋转效果

    本文将深入探讨如何在Android中实现View的3D旋转效果。 首先,理解Android的视图系统至关重要。Android中的View是UI的基本构建块,它负责绘制和处理用户交互。要实现3D旋转,我们需要对View的绘制过程有深入的理解...

    Android View 3D旋转

    在Android开发中,View的3D旋转是一种常用的技术,它能为用户界面带来生动和立体的效果。本篇文章将深入探讨Android中的View 3D旋转,包括基本概念、实现方法、关键API以及实际应用示例。 一、3D旋转基础 在Android...

Global site tag (gtag.js) - Google Analytics