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

本文实例讲述了Android编程实现3D滑动旋转效果的方法。分享给大家供大家参考,具体如下:

这里我们通过代码实现一些滑动翻页的动画效果。

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

完整实例代码代码点击此处本站下载。

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • Android开发 OpenGL ES绘制3D 图形实例详解

    OpenGL ES是 OpenGL三维图形API 的子集,针对手机.PDA和游戏主机等嵌入式设备而设计. Ophone目前支持OpenGL ES 1.0 ,OpenGL ES 1.0 是以 OpenGL 1.3 规范为基础的,OpenGL ES 1.1 是以 OpenGL 1.5 规范为基础的.本文主要介绍利用OpenGL ES绘制图形方面的基本步骤. 本文内容由三部分构成.首先通过EGL获得OpenGL ES的编程接口;其次介绍构建3D程序的基本概念;最后是一个应用程序示例. OpenGL E

  • 安卓(Android)实现3DTouch效果

    本篇博客要做的效果图: 来个低质量动图: 这个动图效果不是很好,实际上模糊效果应该是像上面第一张图那样的,后面会放出代码,有兴趣的可以试着运行一下看看效果. 先说一下思路,我们要实现这个效果其实只需要掌握几个东西: 1.屏幕截图 2.模糊高斯模糊) 3.添加视图 4.弹出动画 5.处理长按事件 6.优化(模糊速度和强度) 流程:当用户长按一个Item的时候,我们先截取一张当前屏幕的图片,接着将这张图片进行压缩后再进行高斯模糊,再覆盖在整个布局上面(包括覆盖Toolbar),这样界面模糊的效果就出

  • Android编程之OpenGL绘图技巧总结

    本文实例讲述了Android编程之OpenGL绘图技巧.分享给大家供大家参考,具体如下: 很久不用OpenGL ES绘图,怕自己忘记了,于是重新复习一遍,顺便原理性的东西总结如下: 1. Android 3D坐标系统 如图: Android的三维坐标系统中: 坐标原点位于中央, X轴从左向右延伸,原点左边的值为负数,右边为正数: Y轴从下向上延伸,原点下边的值为负数,上边为正数: Z轴屏幕里面向外面延伸,屏幕里面为负数,外面为正数. 2. 开发工具(OpenGL和OpenGL ES)介绍 Ope

  • Android 3D旋转动画效果实现分解

    这篇文章主要介绍一下如何实现View的3D旋转效果,实现的主要原理就是围绕Y轴旋转,同时在Z轴方面上有一个深入的缩放. 演示的demo主要有以下几个重点: 1,自定义旋转动画 2,动画做完后,重置ImageView 先看一下程序的运行效果:  1,自定义动画类 这里实现了一个Rotate3dAnimation的类,它扩展了Animation类,重写applyTransformation()方法,提供指定时间的矩阵变换,我们在这个方法里,就可以利用Camera类得得到一个围绕Y轴旋转的matrix

  • Android实现动态向Gallery中添加图片及倒影与3D效果示例

    本文实例讲述了Android实现动态向Gallery中添加图片及倒影与3D效果的方法.分享给大家供大家参考,具体如下: 在Android中gallery可以提供一个很好的显示图片的方式,实现上面的效果以及动态添加数据库或者网络上下载下来的图片资源.我们首先实现一个自定义的Gallery类. MyGallery.java: package nate.android.Service; import android.content.Context; import android.graphics.Ca

  • Android利用Camera实现中轴3D卡牌翻转效果

    在Android系统API中,有两个Camera类: android.graphics.Camera android.hardware.Camera 第二个应用于手机硬件中的相机相关的操作,本文讲述的是利用第一个Camera类实现中轴3D转换的卡牌翻转效果,开始之前,先看一下Android系统中的坐标系: 对应于三维坐标系中的三个方向,Camera提供了三种旋转方法: rotateX() rotateY() rotateX() 调用这三种方法,传入旋转角度参数,即可实现视图沿着坐标轴旋转的功能.

  • Android控件Gallery3D效果实例代码

    贴上代码: 1.扩展Gallery: 复制代码 代码如下: public class GalleryFlow extends Gallery { private Camera mCamera = new Camera();//相机类 private int mMaxRotationAngle = 60;//最大转动角度 private int mMaxZoom = -300;////最大缩放值 private int mCoveflowCenter;//半径值 public GalleryFlo

  • Android编程实现3D旋转效果实例

    本文实例讲述了Android编程实现3D旋转效果的方法.分享给大家供大家参考,具体如下: 下面的示例是在Android中实现图片3D旋转的效果. 实现3D效果一般使用OpenGL,但在Android平台下可以不直接使用OpenGL,而是使用Camera实现,Camera中原理最终还是使用OpenGL,不过使用Camera比较方便. Camera类似一个摄像机,当物体不动时,我们带着摄像机四处移动,在摄像机里面的画面就会有立体感,就可以从其它的角度观看这个物体.废话不多说,直接看示例. 运行效果如

  • 基于Android实现3D翻页效果

    最近做了一个简单的3D效果翻页特效,先说说我的思路吧,首先我这个翻页效果并不是两个Activity之间的跳转,而是在同一个activity类切换不同的view而已.我现在的做法是单击一个button然后Gone当前的布局,然后把需要呈现的布局visible,在隐藏当前布局的时候启动动画,然后给动画添加监听,在动画结束时开始另外一个view的入场动画就行了. 下面来看下我的主页面的布局文件: <FrameLayout xmlns:android="http://schemas.android

  • Android 使用Gallery实现3D相册(附效果图+Demo源码)

    今天因为要做一个设置开机画面的功能,主要是让用户可以设置自己的开机画面,应用层需要做让用户选择开机画面图片的功能.所以需要做一个简单的图片浏览选择程序.最后选用Gallery作为基本控件.加入了一些炫一点的元素,做成3D滑动效果.下面是Demo例子截图: 这个效果网上已经很多人做出来了,只是这次需要用到,所以自己也实践了一下(这里例子我也是根据网上一些资料编写).特意找了几张美女图片给大家养养眼,O(∩_∩)O哈!下面针对一些关键代码进行简要说明,需要做这方面东西的朋友可以看看.这篇文章是实用性

  • Android动画之3D翻转效果实现函数分析

    Android中的翻转动画效果的实现,首先看一下运行效果如上图所示. Android中并没有提供直接做3D翻转的动画,所以关于3D翻转的动画效果需要我们自己实现,那么我们首先来分析一下Animation 和 Transformation. Animation动画的主要接口,其中主要定义了动画的一些属性比如开始时间,持续时间,是否重复播放等等.而Transformation中则包含一个矩阵和alpha值,矩阵是用来做平移,旋转和缩放动画的,而alpha值是用来做alpha动画的,要实现3D旋转动画

随机推荐