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( 0 0 , centerX); 
mCamera.rotateY(degrees); 
mCamera.translate(
0 0 - 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(
0 0 , centerX);
 
mCamera.rotateY(degrees);
 
mCamera.translate(
0 0 - 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 - 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);

 



你可能感兴趣的:(android)