`

API DEMO中3D旋转Layout效果

 
阅读更多
LayoutChange.java:
package cn.com;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
import android.widget.Button;

public class LayoutChange extends Activity {

	ViewGroup layout1, layout2;
	public int order;
	DisplayNextView displayNext;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.layout1);

		displayNext = new DisplayNextView(this);

		layout1 = (ViewGroup) findViewById(R.id.layout1);
		Button b1 = (Button) findViewById(R.id.button1);
		b1.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View v) {
				order = 1;
				applyClockInverseRotation(layout1, 0, -90, layout1.getWidth() / 2.0f,
						layout1.getHeight() / 2.0f, true);
			}
		});
	}

	/** 顺时针方向旋转90° */
	public void applyClockwiseRotation(ViewGroup mView, float start, float end, float centerX, float centerY,
			boolean isAddListener) {
		final Rotate3dAnimation rotation = new Rotate3dAnimation(start, end, centerX, centerY, 200.0f,
				isAddListener);
		rotation.setDuration(500);
		rotation.setFillAfter(true);
		rotation.setInterpolator(new AccelerateInterpolator());
		if (isAddListener) {
			rotation.setAnimationListener(displayNext);
		}
		mView.startAnimation(rotation);
	}

	/**
	 * @Description:逆时针方向旋转90°.
	 * 
	 * @param mView
	 *                需要应用动画的View.
	 * @param start
	 *                动画初始角度值.
	 * @param end
	 *                动画结束角度值.
	 * @param centerX
	 *                旋转动画中心点x坐标.
	 * @param centerY
	 *                旋转动画中心点y坐标.
	 * @param mIsAddListener
	 * 
	 * @return void 返回类型
	 */
	public void applyClockInverseRotation(ViewGroup mView, float start, float end, float centerX, float centerY,
			boolean mIsAddListener) {
		final Rotate3dAnimation rotation = new Rotate3dAnimation(start, end, centerX, centerY, 200.0f,
				mIsAddListener);
		rotation.setDuration(500);
		rotation.setFillAfter(true);
		rotation.setInterpolator(new AccelerateInterpolator());
		if (mIsAddListener) {
			rotation.setAnimationListener(displayNext);
		}
		mView.startAnimation(rotation);
	}

	public void jumpToLayout1() {
		setContentView(R.layout.layout1);
		layout1 = (ViewGroup) findViewById(R.id.layout1);
		Button b1 = (Button) findViewById(R.id.button1);
		b1.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View v) {
				order = 1;
				applyClockInverseRotation(layout1, 0, -90, layout1.getWidth() / 2.0f,
						layout1.getHeight() / 2.0f, true);
			}
		});
	}

	public void jumpToLayout2() {
		setContentView(R.layout.layout2);
		layout2 = (ViewGroup) findViewById(R.id.layout2);
		Button b2 = (Button) findViewById(R.id.button2);
		b2.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View v) {
				order = 2;
				applyClockwiseRotation(layout2, 0, 90, layout2.getWidth() / 2.0f,
						layout2.getHeight() / 2.0f, true);
			}
		});
	}
}



Rotate3dAnimation.java:
package cn.com;

import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.graphics.Camera;
import android.graphics.Matrix;

/**
 * An animation that rotates the view on the Y axis between two specified angles. This animation also adds a translation on the Z
 * axis (depth) to improve the effect.
 */
public class Rotate3dAnimation extends Animation {
	private final float mFromDegrees;
	private final float mToDegrees;
	private final float mCenterX;
	private final float mCenterY;
	private final float mDepthZ;
	private final boolean mReverse;
	private Camera mCamera;

	/**
	 * Creates a new 3D rotation on the Y axis. The rotation is defined by its start angle and its end angle. Both angles are
	 * in degrees. The rotation is performed around a center point on the 2D space, definied by a pair of X and Y coordinates,
	 * called centerX and centerY. When the animation starts, a translation on the Z axis (depth) is performed. The length of
	 * the translation can be specified, as well as whether the translation should be reversed in time.
	 * 
	 * @param fromDegrees
	 *                the start angle of the 3D rotation
	 * @param toDegrees
	 *                the end angle of the 3D rotation
	 * @param centerX
	 *                the X center of the 3D rotation
	 * @param centerY
	 *                the Y center of the 3D rotation
	 * @param reverse
	 *                true if the translation should be reversed, false otherwise
	 */
	public Rotate3dAnimation(float fromDegrees, float toDegrees, float centerX, float centerY, float depthZ,
			boolean reverse) {
		mFromDegrees = fromDegrees;
		mToDegrees = toDegrees;
		mCenterX = centerX;
		mCenterY = centerY;
		mDepthZ = depthZ;
		mReverse = reverse;
	}

	@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 fromDegrees = mFromDegrees;
		float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);

		final float centerX = mCenterX;
		final float centerY = mCenterY;
		final Camera camera = mCamera;

		final Matrix matrix = t.getMatrix();

		camera.save();
		if (mReverse) {
			camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime);
		} else {
			camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime));
		}
		camera.rotateY(degrees);
		camera.getMatrix(matrix);
		camera.restore();

		matrix.preTranslate(-centerX, -centerY);
		matrix.postTranslate(centerX, centerY);
	}
}



DisplayNextView.java:
package cn.com;

import android.view.View;
import android.view.animation.Animation;

public class DisplayNextView implements Animation.AnimationListener {
	LayoutChange lc;

	public DisplayNextView(LayoutChange lc) {
		this.lc = lc;
	}

	public void onAnimationStart(Animation animation) {
	}

	public void onAnimationEnd(Animation animation) {
		if (lc.order == 1) {
			lc.layout1.post(new SwapViews());
		}
		if (lc.order == 2) {
			lc.layout2.post(new SwapViews());
		}

	}

	public void onAnimationRepeat(Animation animation) {
	}

	private final class SwapViews implements Runnable {

		public void run() {
			if (lc.order == 1) {
				lc.layout1.setVisibility(View.GONE);
				lc.jumpToLayout2();
				lc.layout2.setVisibility(View.VISIBLE);
				lc.applyClockInverseRotation(lc.layout2, 90, 0, 160, 192, false);
			} else if (lc.order == 2) {
				lc.jumpToLayout1();
				lc.applyClockwiseRotation(lc.layout1, -90, 0, 160, 192, false);
			}

		}
	}
}


3个类文件,自己添加2个含有按钮的Layout既可以实现.
分享到:
评论
1 楼 时间拾贝 2012-02-27  
楼主能否上传一下源代码啊?十分感谢!

相关推荐

    JTopo 官方Demo API 源码

    **JTopo官方Demo API源码详解** JTopo是一款强大的JavaScript网络拓扑图库,专为绘制和操作网络拓扑图而设计。它提供了丰富的API接口,使得开发者能够轻松创建各种复杂的网络拓扑结构,如数据中心、网络设备布局、...

    JTopo官网API demo离线资源包

    在"JTopo官网API demo离线资源包"中,我们可以找到一系列示例和文档,帮助我们深入理解和使用JTopo。 **1. JTopo的基本概念** - **拓扑图**:由节点(Node)和连接线(Link)构成的图形表示,常用于表示复杂的系统...

    IOS应用源码Demo-可以拖动图片,并可以进行图片旋转的demo-毕设学习.zip

    这些API可以创建平滑的动画效果,使图片在用户触碰时旋转。 5. **响应式编程(Responder Chain)**:在iOS中,用户交互通常通过响应者对象(如UIViewController、UIView)来处理。源码可能展示了如何利用响应者链来...

    ios-弹出旋转菜单,类似建行客户端旋转菜单的简单demo.zip

    在这个Demo中,很可能是使用了UIKit提供的UIView动画API,如`UIView.animate(withDuration:animations:)`或`UIViewPropertyAnimator`。这些方法可以方便地创建平滑的过渡效果,使菜单在点击后以旋转的方式展开或收起...

    IOS抽屉效果的Demo

    以上就是"IOS抽屉效果的Demo"中可能涉及的知识点,涵盖了手势识别、布局、动画、ViewController管理等多个方面,为开发者实现类似功能提供了理论基础和实践指导。通过学习和理解这些概念,你可以创建出具有专业水准...

    可以拖动图片,并可以进行图片旋转的demo功能ios源码.rar

    7. 动画:在iOS中,可以使用UIView的动画API(如`animateWithDuration:animations:`)来平滑地过渡图片的拖动和旋转效果,提高用户体验。 8. MVC(模型-视图-控制器)架构:iOS开发遵循MVC设计模式,代码可能将业务...

    YUI2.8.1包括demo api是学习的好东西

    9. **Demo与API文档**:YUI 2.8.1版本中包含了示例代码和详细的API文档,这是学习和理解YUI功能的关键。通过阅读和实践这些示例,开发者可以快速掌握如何在实际项目中应用YUI。 10. **社区支持**:作为一款成熟的...

    ios源码之一个点击图标以3D动画的形式跳出的view demo.rar

    通过学习和理解这个demo,开发者不仅可以掌握如何在iOS中创建3D动画,还能了解到如何整合多种技术来提升应用的视觉效果和用户体验。这个源码示例是一个宝贵的教育资源,对于提升iOS动画和交互设计技能大有裨益。

    jquery-easyui-1.4.5 demo带索引及中文api

    在描述中提到的 "demo带索引及中文API",意味着这个压缩包不仅提供了演示示例,还增加了方便开发者查阅的索引和中文API文档,这对于中国开发者来说尤其友好,可以更便捷地理解和使用各种组件。 EasyUI 的核心在于其...

    IOS应用源码Demo-酷炫的图片展示效果-毕设学习.zip

    源码中可能使用了这些API来实现图片的淡入淡出、旋转、缩放等动画效果。 5. **异步加载图片**:在处理大量图片时,为避免阻塞UI,通常会使用异步加载策略。这可能涉及到网络请求(如NSURLSession或Alamofire)和...

    Gallery的小demo倒影效果滑动翻转

    本篇将详细讲解`Gallery`实现的小demo中的倒影效果和滑动翻转功能。 首先,`Gallery`是一个基于`AbsSpinner`的视图,它提供了水平方向上的滚动行为。开发者可以通过设置`Adapter`来填充`Gallery`的内容,每个`...

    大风车系列demo

    本示例“大风车系列demo”就是一个很好的实践,它演示了如何模拟风车的旋转效果。在这个项目中,我们将深入探讨自定义View的核心知识点,包括View的基本结构、绘图API以及动画实现。 首先,我们需要了解自定义View...

    GLSurfaceView入门demo

    随着对OpenGL ES API的深入学习,我们可以创建更复杂的3D场景、实现物理模拟、光照效果以及动画等高级特性。在实际项目中,开发者可以根据需求选择合适的库,如libGDX、JMonkeyEngine等,它们基于GLSurfaceView提供...

    QT5.9官方组件demo flatstyle

    QT5.9官方组件demo flatstyle是一个用于展示QT5.9框架中FlatStyle设计风格的示例项目。这个Demo旨在帮助开发者了解如何在QT5.9中应用和自定义FlatStyle,这是一种现代化、扁平化的界面设计风格,使得应用程序看起来...

    GEF教程及demo源码

    **GEF教程及DEMO源码详解** ...总结,GEF教程及DEMO源码的学习,不仅能帮助开发者理解图形编辑框架的设计思想,还能掌握实际开发中的关键技术点。通过实践,可以快速上手并开发出满足特定需求的图形编辑工具。

    Android应用源码 ListView下拉刷新 Demo

    这个"Android应用源码 ListView下拉刷新 Demo"提供了一个实际的例子,帮助开发者了解如何在ListView中实现这一功能。 1. **SwipeRefreshLayout**:Android SDK 提供了一个名为SwipeRefreshLayout的布局容器,它是...

    Android重力感应Demo

    通过这个Demo,开发者可以学习到如何利用Android的Sensor API,结合SensorEventListener接口,实现对设备运动和方向变化的实时监控。这个知识对于开发游戏、健康监测、导航等相关应用至关重要。

    Android ApiDemo

    Android ApiDemo是Android开发中的一个重要学习资源,它包含了大量的示例代码,涵盖了Android SDK的各种API功能,对于开发者来说,这是一个不可多得的学习和参考工具。本篇文章将深入探讨ApiDemo中的核心知识点,并...

    DOJO-DEMO官网提取版

    DOJO 包含 `dojo/fx` 和 `dijit/fx` 模块,提供了丰富的动画效果,如淡入淡出、滑动、旋转等,让开发者可以轻松创建动态用户体验。 7. **DOJO 国际化与本地化** DOJO 提供了 `dojo/i18n` 和 `dojo/nls` 模块,...

    Android ProgressBar进度条Demo源码.rar

    这个"Android ProgressBar进度条Demo源码.rar"压缩包提供的就是一个关于如何在Android应用中使用ProgressBar的示例代码。下面我们将深入探讨ProgressBar的基本概念、类型以及如何在实际开发中应用。 1. **...

Global site tag (gtag.js) - Google Analytics