Layout之间3D切换效果Demo

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

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>


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>


color.xml

<?xml version="1.0" encoding="utf-8"?>
  <resources>
    <drawable name="black">#000000</drawable>
    <drawable name="white">#FFFFFFFF</drawable>
  </resources>



 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值