edison_cool911 发表于 2013-1-28 18:43:39

Layout之间3D切换效果Demo

先上个效果图(跟自己Blog中的浏览图片的代码类似,不过是layout之间切换)
http://dl.iteye.com/upload/attachment/283550/734fcdac-9198-350e-8753-c8e2c015283b.png
相信这个效果很多人都需要,现在共享在这里供大家学习:
1.Layout3D.java
package cn.com;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.Button;public class Layout3D extends Activity {private int mCenterX = 160;private int mCenterY = 0;private ViewGroup layout1;private ViewGroup layout2;private Rotate3d leftAnimation;private Rotate3d rightAnimation;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);initFirst();layout1 = (ViewGroup) findViewById(R.id.layout1);Button b1 = (Button) findViewById(R.id.button1);b1.setEnabled(true);b1.setOnClickListener(new Button.OnClickListener() {public void onClick(View v) {leftMoveHandle();v.setEnabled(false);}});}public void initFirst(){leftAnimation = new Rotate3d(0, -90, 0.0f, 0.0f, mCenterX, mCenterY);rightAnimation = new Rotate3d(90, 0, 0.0f, 0.0f, mCenterX, mCenterY);leftAnimation.setFillAfter(true);leftAnimation.setDuration(1000);rightAnimation.setFillAfter(true);rightAnimation.setDuration(1000);}public void initSecond(){leftAnimation = new Rotate3d(-90, 0, 0.0f, 0.0f, mCenterX, mCenterY);rightAnimation = new Rotate3d(0, 90, 0.0f, 0.0f, mCenterX, mCenterY);leftAnimation.setFillAfter(true);leftAnimation.setDuration(1000);rightAnimation.setFillAfter(true);rightAnimation.setDuration(1000);}public void jumpToLayout1(Rotate3d leftAnimation) {setContentView(R.layout.main);layout1 = (ViewGroup) findViewById(R.id.layout1);layout1.startAnimation(leftAnimation);Button b1 = (Button) findViewById(R.id.button1);b1.setEnabled(true);b1.setOnClickListener(new Button.OnClickListener() {public void onClick(View v) {leftMoveHandle();}});}public void jumpToLayout2(Rotate3d rightAnimation) {setContentView(R.layout.mylayout);layout2 = (ViewGroup) findViewById(R.id.layout2);layout2.startAnimation(rightAnimation);Button b2 = (Button) findViewById(R.id.button2);b2.setEnabled(true);b2.setOnClickListener(new Button.OnClickListener() {public void onClick(View v) {rightMoveHandle();}});}public void leftMoveHandle() {initFirst();layout1.startAnimation(leftAnimation);jumpToLayout2(rightAnimation);}public void rightMoveHandle() {initSecond();layout2.startAnimation(rightAnimation);jumpToLayout1(leftAnimation);}}
2.Rotate3d.java
package cn.com;import android.graphics.Camera;import android.graphics.Matrix;import android.view.animation.Animation;import android.view.animation.Transformation;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;}@Overridepublic void initialize(int width, int height, int parentWidth,int parentHeight) {super.initialize(width, height, parentWidth, parentHeight);mCamera = new Camera();}@Overrideprotected 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);}}

3.main.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout android:layout_width="fill_parent"android:id="@+id/layout1" android:layout_height="fill_parent"android:background="@drawable/black" xmlns:android="http://schemas.android.com/apk/res/android"><Button android:id="@+id/button1" android:layout_width="118px"android:layout_height="wrap_content" android:text="Go to Layout2"></Button><TextView android:id="@+id/text1" android:textSize="24sp"android:layout_width="186px" android:layout_height="29px"android:text="@string/layout1" android:layout_below="@+id/button1"></TextView></RelativeLayout>
4.mylayout.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout android:layout_width="fill_parent"android:id="@+id/layout2" android:layout_height="fill_parent"android:background="@drawable/white" xmlns:android="http://schemas.android.com/apk/res/android"><Button android:id="@+id/button2" android:layout_width="118px"android:layout_height="wrap_content" android:text="Go to Layout1"></Button><TextView android:id="@+id/text2" android:textSize="24sp"android:layout_width="186px" android:layout_height="29px"android:textColor="@drawable/black" android:text="@string/layout2"android:layout_below="@+id/button2"></TextView></RelativeLayout>
页: [1]
查看完整版本: Layout之间3D切换效果Demo