Layout之间3D切换效果Demo

先上个效果图(跟自己Blog中的浏览图片的代码类似,不过是layout之间切换)
[img]http://dl.iteye.com/upload/attachment/283550/734fcdac-9198-350e-8753-c8e2c015283b.png[/img]
相信这个效果很多人都需要,现在共享在这里供大家学习:
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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值