`

Layout之间3D切换效果Demo

阅读更多
先上个效果图(跟自己Blog中的浏览图片的代码类似,不过是layout之间切换)

相信这个效果很多人都需要,现在共享在这里供大家学习:
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. */
	@Override
	public 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;

	}

	@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);
	}
}



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>
  • 大小: 20.5 KB
分享到:
评论
3 楼 andliy 2011-02-25  
楼主V5 学习了!
2 楼 crazier9527 2010-12-07  
谢谢分享~
1 楼 edison_cool911 2010-07-26  
<?xml version="1.0" encoding="utf-8"?>
  <resources>
    <drawable name="black">#000000</drawable>
    <drawable name="white">#FFFFFFFF</drawable>
  </resources>
这个是color.xml没附上

相关推荐

Global site tag (gtag.js) - Google Analytics