`

Android animation滑动效果进阶篇—— 3D旋转

 
阅读更多



 前面介绍了利用Android自带的控件,进行滑动翻页制作效果,现在我们通过代码实现一些滑动翻页的动画效果。

Animation实现动画有两个方式:帧动画(frame-by-frame animation)和补间动画(tweened animation

 

本示例通过继承Animation自定义Rotate3D,实现3D翻页效果。效果图如下:



 

1、Rotate3D(Animation)

首先,自定义Animation的3D动画类Rotate3D

public class Rotate3D extends Animation {
	private float fromDegree;	// 旋转起始角度
	private float toDegree;		// 旋转终止角度
	private float mCenterX;		// 旋转中心x
	private float mCenterY;		// 旋转中心y
	private Camera mCamera;

	public Rotate3D(float fromDegree, float toDegree, float centerX, float centerY) {
		this.fromDegree = fromDegree;
		this.toDegree = toDegree;
		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 = fromDegree;
		float degrees = FromDegree + (toDegree - fromDegree) * interpolatedTime;	// 旋转角度(angle)
		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);		// 位移x
			mCamera.rotateY(degrees);
			mCamera.translate(0, 0, -centerX);
			mCamera.getMatrix(matrix);
			mCamera.restore();
		}

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

 

然后,实例化Rotate3D的旋转方向

	public void initAnimation() {
		// 获取旋转中心
		DisplayMetrics dm = new DisplayMetrics();
		dm = getResources().getDisplayMetrics();
		mCenterX = dm.widthPixels / 2;
		mCenterY = dm.heightPixels / 2;
		
		// 定义旋转方向
		int duration = 1000;
		lQuest1Animation = new Rotate3D(0, -90, mCenterX, mCenterY);	// 下一页的【question1】旋转方向(从0度转到-90,参考系为水平方向为0度)
		lQuest1Animation.setFillAfter(true);
		lQuest1Animation.setDuration(duration);

		lQuest2Animation = new Rotate3D(90, 0, mCenterX, mCenterY);		// 下一页的【question2】旋转方向(从90度转到0,参考系为水平方向为0度)(起始第一题)
		lQuest2Animation.setFillAfter(true);
		lQuest2Animation.setDuration(duration);

		rQuest1Animation = new Rotate3D(0, 90, mCenterX, mCenterY);		// 上一页的【question1】旋转方向(从0度转到90,参考系为水平方向为0度)
		rQuest1Animation.setFillAfter(true);
		rQuest1Animation.setDuration(duration);

		rQuest2Animation = new Rotate3D(-90, 0, mCenterX, mCenterY);	// 上一页的【question2】旋转方向(从-90度转到0,参考系为水平方向为0度)
		rQuest2Animation.setFillAfter(true);
		rQuest2Animation.setDuration(duration);
	}

 2、Activity

首先,定义两个布局文件,用于旋转的画面切换

main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:id="@+id/layout_main"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content"    		
	android:orientation="vertical">

...

</LinearLayout>

 next.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:id="@+id/layout_next"
	android:layout_width="fill_parent"
	android:layout_height="wrap_content"    		
	android:orientation="vertical">

...

</LinearLayout>

 

限于篇幅,完整布局文件请详见源码 ^_^

 

然后,初始化两个旋转的布局文件资源

	private void initMain(){
        setContentView(R.layout.main);

		layoutmain = (LinearLayout)findViewById(R.id.layout_main);
		btn_MainLast = (Button)findViewById(R.id.main_last);
		btn_MainNext = (Button)findViewById(R.id.main_next);
		
		btn_MainLast.setOnClickListener(listener);
		btn_MainNext.setOnClickListener(listener);
	}
	
	private void initNext(){
        setContentView(R.layout.next);

		layoutnext = (LinearLayout)findViewById(R.id.layout_next);
		btn_NextLast = (Button)findViewById(R.id.next_last);
		btn_NextNext = (Button)findViewById(R.id.next_next);
		
		btn_NextLast.setOnClickListener(listener);
		btn_NextNext.setOnClickListener(listener);
	}

 

最后,设置布局文件中的按钮监听事件,响应3D旋转动画和方向

	private View.OnClickListener listener = new View.OnClickListener() {
		@Override
		public void onClick(View v) {
			switch (v.getId()) {
			case R.id.main_last:	// 上一页
				layoutmain.startAnimation(lQuest1Animation);	// 当前页向左旋转(0,-90)
				initNext();
				layoutnext.startAnimation(lQuest2Animation);	// 下一页向左旋转(90, 0)
				break;
			case R.id.main_next:	// 下一页
				layoutmain.startAnimation(rQuest1Animation);	// 当前页向右旋转(0,90)
				initNext();
				layoutnext.startAnimation(rQuest2Animation);	// 下一页向右旋转(-90, 0)
				break;
			case R.id.next_last:
				layoutnext.startAnimation(lQuest1Animation);
				initMain();
				layoutmain.startAnimation(lQuest2Animation);
				break;
			case R.id.next_next:
				layoutnext.startAnimation(rQuest1Animation);
				initMain();
				layoutmain.startAnimation(rQuest2Animation);
				break;
			}
		}
	};

 

  • 大小: 19.5 KB
1
4
分享到:
评论

相关推荐

    Android 滑动效果 3D旋转

    本文将深入探讨如何使用Animation动画实现Android的3D旋转滑动效果。 首先,Android中的动画主要分为两种类型:Property Animation(属性动画)和View Animation(视图动画)。在本案例中,我们将关注View ...

    Android的3D旋转

    在Android中,我们可以使用`android.view.animation`包下的`RotateAnimation`类来创建2D旋转动画,但若要实现3D旋转,则需要利用到`android.graphics.Matrix`类和`Camera`类。 `Matrix`类是Android图形系统的基础,...

    Android编程实现3D滑动旋转效果的方法

    本文实例讲述了Android编程实现3D滑动旋转效果的方法。分享给大家供大家参考,具体如下: 这里我们通过代码实现一些滑动翻页的动画效果。 Animation实现动画有两个方式:帧动画(frame-by-frame animation)和补间...

    安卓Android源码——随手势进行3D旋转的源码.zip

    这份"安卓Android源码——随手势进行3D旋转的源码.zip"提供了实现这一功能的示例代码,旨在帮助开发者理解和实践如何在Android应用中实现实时的手势驱动的3D旋转效果。 首先,让我们了解一下Android中的手势识别。...

    安卓Android源码——圆形旋转菜单.zip

    总的来说,"安卓Android源码——圆形旋转菜单.zip"提供了一个关于Android自定义视图和动画实现的实例,对于学习Android开发,尤其是UI设计和动画效果的实现具有很高的参考价值。通过研究这个源码,开发者可以深入...

    Android源码——圆形旋转菜单.zip

    在Android中,可以利用`Animation`类或`ObjectAnimator`来实现动画效果。对于这个圆形旋转菜单,开发者可能使用了`RotateAnimation`,它允许菜单项围绕中心点旋转。同时,配合`onTouchEvent()`事件处理,当用户触摸...

    android 3D旋转效果控件

    在Android开发中,3D旋转效果控件是一种增强用户界面体验的重要技术,它能为应用程序带来生动、立体的视觉效果。3D旋转通常涉及到视图的转换和动画,通过使用Android提供的视图动画API或者属性动画API来实现。本文将...

    android叠层3D旋转效果

    在Android应用开发中,创建富有视觉吸引力的用户体验是至关重要的,而“android叠层3D旋转效果”就是一种能够提升用户界面(UI)体验的技术。本文将深入探讨如何在Android中实现这种效果,以及它是如何工作的。 ...

    Android自定义动画 3D旋转

    本篇文章主要探讨的是如何实现3D旋转这一特殊的自定义动画效果。3D旋转是Android动画库中的一种高级技巧,通过它可以创建出逼真的立体旋转效果,为用户带来更丰富的视觉体验。 在Android中,自定义动画主要包括两种...

    Android View 3D旋转

    本篇文章将深入探讨Android中的View 3D旋转,包括基本概念、实现方法、关键API以及实际应用示例。 一、3D旋转基础 在Android中,3D旋转是通过组合多个2D旋转来实现的,这些2D旋转可以在不同的轴上进行,例如X轴、Y...

    android 实例代码(下) 进阶篇

    在Android开发领域,进阶篇通常涵盖了一些更高级、更复杂的技术和实践,这些内容是开发者在掌握了基础知识后,为了提升应用性能、用户体验以及实现更丰富功能所必须掌握的。以下是一些可能在"android 实例代码(下)...

    Android菜单(3D旋转效果)

    "Android菜单(3D旋转效果)"就是一个实例,展示了如何利用Android的动画框架实现动态、立体的菜单展示效果。在这个项目中,开发者通过编程实现了3D旋转,使用户在打开或关闭菜单时看到一个逼真的3D翻转动画。 首先...

    Android 自定义View (二) 进阶

    本篇文章将深入探讨“Android自定义View的进阶”话题,结合提供的资源,我们将学习如何通过实践来提升自定义View的能力。 首先,自定义View的基本步骤包括创建一个新的View类,继承自Android内置的View或 ViewGroup...

    android 3D 旋转效果

    综上所述,Android 3D旋转效果的实现涉及到多种技术和策略,从基本的`Animation`类到强大的Property Animation API,开发者可以根据项目需求选择合适的方法。`MyRorateViewTest`项目为学习和实践这一技术提供了很好...

    android 3D旋转相册

    3. **Animation和Animator**:Android的动画系统可以用来实现3D旋转效果。`ObjectAnimator`和`ValueAnimator`可以控制对象属性随时间变化,从而创建平滑的动画效果。`PropertyAnimator`接口则提供了对对象属性更精细...

    安卓Android源码——3D效果播放器源码.zip

    此外,使用Android的Property Animation或者ObjectAnimator可以实现流畅的3D动画效果。 4. **SurfaceView和TextureView**:在Android中,SurfaceView和TextureView是用于显示视频的两种常见视图。SurfaceView适合于...

    android360度3D旋转动画

    在Android开发中,360度3D旋转动画是一种常用且引人注目的视觉效果,可以为用户界面增添动态感和交互性。本教程将深入探讨如何实现这种效果,通过提供的"RotateDemo"代码示例,你可以直接运行并学习。 首先,让我们...

    android canvas 3D旋转木马 图片立体展示

    Android中的Matrix类提供了矩阵操作,可以进行平移、旋转和缩放等变换,是实现3D效果的关键。 2. **旋转动画**:要实现旋转木马的动态效果,需要使用Animation类或者ObjectAnimator来创建旋转动画。可以通过设置...

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

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

    3d旋转相册—css3高级进阶

    在本课程"3d旋转相册—css3高级进阶"中,我们将深入探讨如何利用CSS3的强大功能创建一个令人印象深刻的3D旋转相册。这个项目非常适合那些已经具备一定编程经验,特别是对HTML和CSS有基本理解的开发者。通过学习这个...

Global site tag (gtag.js) - Google Analytics