Android系列之浅谈Android 3D旋转

 我们今天就来说说android中的3D效果,那么android都用到哪些东西才能来实现一个3D的效果那,其实android中的3D效果是用animation配合camera就可以实现在apidemo里就有这样的实例我们首先做一个继承animation的类Rotate3d.java

 

package eoe.3d;
 

public class Rotate3d extends Animation { 
private float mFromDegree; 
private float mToDegree; 
private float mCenterX; 
private float mCenterY; 
private float mLeft; 
private float mTop; 
private Camera mCamera; 
private static final String TAG = "Rotate3d"

public Rotate3d(float fromDegree, float toDegree, float left, float top, 
float centerX, float centerY) { 
this.mFromDegree = fromDegree; 
this.mToDegree = toDegree; 
this.mLeft = left; 
this.mTop = top; 
this.mCenterX = centerX; 
this.mCenterY = centerY; 



@Override 
public void initialize(int width, int height, int parentWidth, 
int parentHeight) { 
super.initialize(width, height, parentWidth, parentHeight); 
mCamera 
= new Camera(); 


@Override 
protected void applyTransformation(float interpolatedTime, Transformation t) { 
final float FromDegree = mFromDegree; 
float degrees = FromDegree + (mToDegree - mFromDegree) 
* interpolatedTime; 
final float centerX = mCenterX; 
final float centerY = mCenterY; 
final Matrix matrix = t.getMatrix(); 

if (degrees <= -76.0f) { 
degrees 
= -90.0f
mCamera.save(); 
mCamera.rotateY(degrees); 
mCamera.getMatrix(matrix); 
mCamera.restore(); 
else if(degrees >=76.0f){ 
degrees 
= 90.0f
mCamera.save(); 
mCamera.rotateY(degrees); 
mCamera.getMatrix(matrix); 
mCamera.restore(); 
}
else
mCamera.save(); 
//这里很重要哦。 
mCamera.translate(00, centerX); 
mCamera.rotateY(degrees); 
mCamera.translate(
00-centerX); 
mCamera.getMatrix(matrix); 
mCamera.restore(); 


matrix.preTranslate(
-centerX, -centerY); 
matrix.postTranslate(centerX, centerY); 



public class Rotate3d extends Animation {
 
private float mFromDegree;
 
private float mToDegree;
 
private float mCenterX;
 
private float mCenterY;
 
private float mLeft;
 
private float mTop;
 
private Camera mCamera;
 
private static final String TAG = "Rotate3d";
 

public Rotate3d(float fromDegree, float toDegree, float left, float top,
 
float centerX, float centerY) {
 
this.mFromDegree = fromDegree;
 
this.mToDegree = toDegree;
 
this.mLeft = left;
 
this.mTop = top;
 
this.mCenterX = centerX;
 
this.mCenterY = centerY;
 

}
 

@Override
 
public void initialize(int width, int height, int parentWidth,
 
int parentHeight) {
 
super.initialize(width, height, parentWidth, parentHeight);
 
mCamera 
= new Camera();
 
}
 

@Override
 
protected void applyTransformation(float interpolatedTime, Transformation t) {
 
final float FromDegree = mFromDegree;
 
float degrees = FromDegree + (mToDegree - mFromDegree)
 
* interpolatedTime;
 
final float centerX = mCenterX;
 
final float centerY = mCenterY;
 
final Matrix matrix = t.getMatrix();
 

if (degrees <= -76.0f) {
 
degrees 
= -90.0f;
 
mCamera.save();
 
mCamera.rotateY(degrees);
 
mCamera.getMatrix(matrix);
 
mCamera.restore();
 
else if(degrees >=76.0f){
 
degrees 
= 90.0f;
 
mCamera.save();
 
mCamera.rotateY(degrees);
 
mCamera.getMatrix(matrix);
 
mCamera.restore();
 
}
else{
 
mCamera.save();
 
//这里很重要哦。
 
mCamera.translate(
00, centerX);
 
mCamera.rotateY(degrees);
 
mCamera.translate(
00-centerX);
 
mCamera.getMatrix(matrix);
 
mCamera.restore();
 
}
 

matrix.preTranslate(
-centerX, -centerY);
 
matrix.postTranslate(centerX, centerY);
 
}
 
}

 

 

 

 有了这个类一切都会变得简单的,接着只要在activity中写两个Rotate3d的对象,让两个view,分别做这两个对象的animation就好了;

 

 

//下面两句很关键哦,
Rotate3d leftAnimation = new Rotate3d(-0, -90, 0, 0, mCenterX, mCenterY);
Rotate3d rightAnimation = new Rotate3d(-0+90, -90+90, 0.0f, 0.0f, mCenterX, mCenterY);

leftAnimation.setFillAfter(true);
leftAnimation.setDuration(1000);
rightAnimation.setFillAfter(true);
rightAnimation.setDuration(1000);

mImageView1.startAnimation(leftAnimation);
mImageView2.startAnimation(rightAnimation);

 

最后就是还要写一下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
="wrap_content" 
> 

<FrameLayout 
android:layout_width="fill_parent" 
android:layout_height
="fill_parent"> 

<ImageView 
android:id="@+id/image1" 
android:layout_gravity
="center_horizontal" 
android:layout_width
="fill_parent" 
android:layout_height
="wrap_content" 
android:src
="@drawable/image1" 
/> 
<ImageView 
android:id="@+id/image2" 
android:background
="#ffff0000" 
android:layout_gravity
="center_horizontal" 
android:layout_width
="fill_parent" 
android:layout_height
="wrap_content" 
android:src
="@drawable/image2" 
/> 

</FrameLayout> 
</LinearLayout>



 


也不知道我理解的对不对,希望大家多多的指点我,这样我才能在短时间内有所进步,谢谢大家的支持。
  

//下面两句很关键哦, 
Rotate3d leftAnimation = new Rotate3d(-0-9000, mCenterX, mCenterY); 
Rotate3d rightAnimation 
= new Rotate3d(-0+90-90+900.0f0.0f, mCenterX, mCenterY); 

leftAnimation.setFillAfter(
true); 
leftAnimation.setDuration(
1000); 
rightAnimation.setFillAfter(
true); 
rightAnimation.setDuration(
1000); 

mImageView1.startAnimation(leftAnimation); 
mImageView2.startAnimation(rightAnimation);

 



posted on 2011-06-19 23:02  neil-zhao  阅读(1063)  评论(1编辑  收藏  举报

导航