Android做3D旋转动画,Android编程实现3D旋转效果实例

本文实例讲述了Android编程实现3D旋转效果的方法。分享给大家供大家参考,具体如下:

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

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

运行效果如下:

4ce5e2e71c222589a453c555f804aa19.png 

d5ab163f815ef507e991da816cd415d0.png

7fdd659a8c70872acddaddcc1b72bae9.png 

a7bec3cd300a21c28e00f37a50ccc944.png

项目结构:

8d3bd21a1c952b42a83f6c4e7d0287fa.png

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中代码:

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

android:id="@+id/cv"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

/>

希望本文所述对大家Android程序设计有所帮助。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值