`

Layout3D旋转

阅读更多
修改自网上的一篇关于Layout 3D旋转的文章,添加了手势旋转处理

效果图如下:


1.Layout3D.java
package cn.com;

import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
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;

	private GestureDetector gestureDetector;
	private FlingGuest flingGuest;
	
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		initFirst();

		flingGuest = new FlingGuest(Layout3D.this);
		gestureDetector = new GestureDetector(Layout3D.this, flingGuest);
		
		layout1 = (ViewGroup) findViewById(R.id.layout1);
		layout2 = (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);

		layout2 = (ViewGroup) findViewById(R.id.layout1);
		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);
		
		layout1 = (ViewGroup) findViewById(R.id.layout2);
		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);
	}
	
	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		super.dispatchTouchEvent(ev);
		return gestureDetector.onTouchEvent(ev);
	}
}


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
分享到:
评论

相关推荐

    Android的3D旋转

    至于“工具”,Android Studio提供了一系列的调试工具,如Hierarchy Viewer和Layout Inspector,可以帮助开发者可视化和调试3D旋转效果,确保动画在不同设备上表现一致。 总结起来,Android的3D旋转涉及到`Matrix`...

    android studio 3d旋转展示产品的demo

    在Android开发中,3D旋转效果常常用于提升用户体验,特别是在展示产品或图像时,能带给用户更为生动真实的视觉感受。本教程将通过一个基于Android Studio的3D旋转展示产品的demo来详细讲解如何实现这一功能。 首先...

    css3-3d旋转-色子

    **CSS3 3D旋转与色子应用** 在现代网页设计中,CSS3引入了许多新的特性和功能,其中3D变换是极具创新性的一项。3D旋转让元素能够在三维空间中展示动态效果,极大地增强了用户体验。本项目"css3-3d旋转-色子"就是对...

    LoopRotarySwitch:3d旋转切换视图,类似旋转木马效果。可以自动切换!

    3D旋转木马容器控件,可以无限循环,自动旋转(方向分顺时针和逆时针),可以手势切换或单击切换。 效果图 如何使用 在你的项目Gradle添加 compile 'com.dalong:loopview:1.0.4' 或者直接约会库文件 1.0.4版本 1、...

    纯css3全屏图片幻灯片3D立体旋转切换特效

    2. **过渡(Transitions)**:CSS3的过渡效果允许我们在两个样式之间平滑地过渡,比如在图片切换时,可以设定一个平滑的3D旋转过渡,增加视觉吸引力。 3. **动画(Animations)**:CSS3动画通过关键帧(`@keyframes`)...

    ios应用源码之旋转切换图片(类3d效果) 2018128

    在图片旋转切换中,我们会用到`CATransform3DRotate`方法来实现3D旋转效果。 2. **UIImageView**与**CAAnimation**: 通常,我们会将图片存储在`UIImageView`对象中,并通过设置`imageView.layer`的`transform`属性...

    Unity3D 旋转相机视角 镜头缩放 拖动相机视角 Game视窗还原Sence视窗功能

    在Unity3D中,我们可以使用内置的Camera类和Input类来控制相机的旋转。通常,我们会在Update()函数中监听键盘或鼠标输入,根据输入信息更新相机的旋转角度。例如,我们可以用Input.GetAxis("Mouse X")和Input....

    UVLayout一款很方便的模型展UV工具

    "UVLayout"是一款专为3D模型展UV设计的专业软件,因其高效、易用而备受业界好评。本文将详细介绍UVLayout的主要功能、优势以及如何使用它来优化模型的UV展开。 首先,UVLayout以其直观简洁的用户界面著称,即使是对...

    Layout基础教程.pdf

    - 用户可以从SketchUp中导入模型,将3D设计整合到LayOut的文档中,便于进行2D表示和注释。 - 这些模型可以被缩放、旋转,甚至添加动画,使得演示更具动态性和说服力。 总的来说,LayOut 3是SketchUp用户的得力...

    ios-collection实现旋转效果.zip

    瀑布流布局(Waterfall Layout),又称Infinite Scroll或Pinterest Layout,是一种流行的设计模式,特别是在展示图片或者商品的列表中。它的特点是每个单元格的高度根据其内容自动调整,形成多列不等高的布局,模拟...

    Sprint-Layout 6.0 绿色汉化版(20180709更新)

    其次,Sprint-Layout 6.0 提供了强大的编辑工具,如精确的尺寸控制、旋转和镜像操作,以及复制和粘贴功能,使得设计修改和优化变得更加容易。此外,它还支持3D预览,用户可以在设计过程中直观地查看电路板的立体效果...

    最新版本的UVLayout!!功能非常之强大哦~~!!!

    对于复杂的模型,UVLayout提供了强大的手动调整工具,如滑动、旋转、缩放等,使艺术家能够精细化控制每个面的UV位置,确保贴图的准确无误。 其次,UVLayout支持多种三维软件的导入和导出,如Maya和3ds Max。这使得...

    _HEADUS_UVLAYOUT_V2[1].00.05_PRO.rar

    2. **交互式编辑**:用户可以直接在3D视图中拖拽、拉伸和旋转UV,实时预览效果。这种直观的操作方式大大提高了工作效率。 3. **优化工具**:软件内置了多种UV优化算法,如平滑、挤压、均匀分布等,用于改进UV的排列...

    PADS Layout 2007 中文教程

    1. **3D查看**:利用3D视图功能,检查元器件的立体布局和布线的立体效果,提前发现可能的问题。 2. **信号完整性分析**:学习如何进行信号完整性分析,预测电路板的电磁兼容性和性能。 3. **设计规则检查(DRC)**:...

    uvlayout----展UV超级好用软件

    在实际使用中,UVLayout与其他3D软件的集成也相当流畅。它支持导入导出多种常见的3D格式,如OBJ、FBX、3DS等,方便与Maya、3ds Max、Blender等主流建模软件配合使用。在完成UV工作后,可以直接输出为纹理坐标文件,...

    Android-ThreeDLayout一款Android3DLayout可以让任何view拥有3D效果

    这款3D Layout不仅视觉上吸引人,还支持通过触摸事件来触发3D变换,或者执行预设的翻转动画,极大地丰富了用户体验。 首先,我们来深入理解一下ThreeDLayout的工作原理。它基于Android的自定义视图机制,通过对...

    Android旋转效果源码

    这个“Android旋转效果源码”项目显然是专注于实现类似OpenGL的3D旋转效果,使得应用的界面更加生动有趣。 AndroidManifest.xml是Android应用程序的核心配置文件,它定义了应用的基本属性,如应用名称、权限、启动...

    uvlayout CN help

    ### Headus UVLayout 1.20.3 中文帮助文档关键知识点解析 #### 快捷键概述 本文档提供了Headus UVLayout软件在不同模式下的快捷键介绍,包括CED、ENTERED、WED等模式下的操作命令。通过这些快捷键,用户能够更高效...

    flex 3D滚动显示图片

    2. **Transform3D对象**:在ActionScript中,Transform3D对象提供了进行3D变换的方法,如rotateX(), rotateY() 和 rotateZ(),用于实现3D旋转。 3. **Matrix3D类**:Matrix3D类是实现3D变换的核心,它可以存储和...

Global site tag (gtag.js) - Google Analytics