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

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

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

1、Rotate3D(Animation)

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

  1. public class Rotate3D extends Animation {
  2. private float fromDegree;   // 旋转起始角度
  3. private float toDegree;     // 旋转终止角度
  4. private float mCenterX;     // 旋转中心x
  5. private float mCenterY;     // 旋转中心y
  6. private Camera mCamera;
  7. public Rotate3D(float fromDegree, float toDegree, float centerX, float centerY) {
  8. this.fromDegree = fromDegree;
  9. this.toDegree = toDegree;
  10. this.mCenterX = centerX;
  11. this.mCenterY = centerY;
  12. }
  13. @Override
  14. public void initialize(int width, int height, int parentWidth, int parentHeight) {
  15. super.initialize(width, height, parentWidth, parentHeight);
  16. mCamera = new Camera();
  17. }
  18. @Override
  19. protected void applyTransformation(float interpolatedTime, Transformation t) {
  20. final float FromDegree = fromDegree;
  21. float degrees = FromDegree + (toDegree - fromDegree) * interpolatedTime;    // 旋转角度(angle)
  22. final float centerX = mCenterX;
  23. final float centerY = mCenterY;
  24. final Matrix matrix = t.getMatrix();
  25. if (degrees <= -76.0f) {
  26. degrees = -90.0f;
  27. mCamera.save();
  28. mCamera.rotateY(degrees);       // 旋转
  29. mCamera.getMatrix(matrix);
  30. mCamera.restore();
  31. } else if (degrees >= 76.0f) {
  32. degrees = 90.0f;
  33. mCamera.save();
  34. mCamera.rotateY(degrees);
  35. mCamera.getMatrix(matrix);
  36. mCamera.restore();
  37. } else {
  38. mCamera.save();
  39. mCamera.translate(0, 0, centerX);       // 位移x
  40. mCamera.rotateY(degrees);
  41. mCamera.translate(0, 0, -centerX);
  42. mCamera.getMatrix(matrix);
  43. mCamera.restore();
  44. }
  45. matrix.preTranslate(-centerX, -centerY);
  46. matrix.postTranslate(centerX, centerY);
  47. }
  48. }

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

  1. public void initAnimation() {
  2. // 获取旋转中心
  3. DisplayMetrics dm = new DisplayMetrics();
  4. dm = getResources().getDisplayMetrics();
  5. mCenterX = dm.widthPixels / 2;
  6. mCenterY = dm.heightPixels / 2;
  7. // 定义旋转方向
  8. int duration = 1000;
  9. lQuest1Animation = new Rotate3D(0, -90, mCenterX, mCenterY);    // 下一页的【question1】旋转方向(从0度转到-90,参考系为水平方向为0度)
  10. lQuest1Animation.setFillAfter(true);
  11. lQuest1Animation.setDuration(duration);
  12. lQuest2Animation = new Rotate3D(90, 0, mCenterX, mCenterY);     // 下一页的【question2】旋转方向(从90度转到0,参考系为水平方向为0度)(起始第一题)
  13. lQuest2Animation.setFillAfter(true);
  14. lQuest2Animation.setDuration(duration);
  15. rQuest1Animation = new Rotate3D(0, 90, mCenterX, mCenterY);     // 上一页的【question1】旋转方向(从0度转到90,参考系为水平方向为0度)
  16. rQuest1Animation.setFillAfter(true);
  17. rQuest1Animation.setDuration(duration);
  18. rQuest2Animation = new Rotate3D(-90, 0, mCenterX, mCenterY);    // 上一页的【question2】旋转方向(从-90度转到0,参考系为水平方向为0度)
  19. rQuest2Animation.setFillAfter(true);
  20. rQuest2Animation.setDuration(duration);
  21. }

2、Activity

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

main.xml

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:id="@+id/layout_main"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content"
  5. android:orientation="vertical">
  6. ...
  7. </LinearLayout>

next.xml

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:id="@+id/layout_next"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content"
  5. android:orientation="vertical">
  6. ...
  7. </LinearLayout>

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

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

  1. private void initMain(){
  2. setContentView(R.layout.main);
  3. layoutmain = (LinearLayout)findViewById(R.id.layout_main);
  4. btn_MainLast = (Button)findViewById(R.id.main_last);
  5. btn_MainNext = (Button)findViewById(R.id.main_next);
  6. btn_MainLast.setOnClickListener(listener);
  7. btn_MainNext.setOnClickListener(listener);
  8. }
  9. private void initNext(){
  10. setContentView(R.layout.next);
  11. layoutnext = (LinearLayout)findViewById(R.id.layout_next);
  12. btn_NextLast = (Button)findViewById(R.id.next_last);
  13. btn_NextNext = (Button)findViewById(R.id.next_next);
  14. btn_NextLast.setOnClickListener(listener);
  15. btn_NextNext.setOnClickListener(listener);
  16. }

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

    1. private View.OnClickListener listener = new View.OnClickListener() {
    2. @Override
    3. public void onClick(View v) {
    4. switch (v.getId()) {
    5. case R.id.main_last:    // 上一页
    6. layoutmain.startAnimation(lQuest1Animation);    // 当前页向左旋转(0,-90)
    7. initNext();
    8. layoutnext.startAnimation(lQuest2Animation);    // 下一页向左旋转(90, 0)
    9. break;
    10. case R.id.main_next:    // 下一页
    11. layoutmain.startAnimation(rQuest1Animation);    // 当前页向右旋转(0,90)
    12. initNext();
    13. layoutnext.startAnimation(rQuest2Animation);    // 下一页向右旋转(-90, 0)
    14. break;
    15. case R.id.next_last:
    16. layoutnext.startAnimation(lQuest1Animation);
    17. initMain();
    18. layoutmain.startAnimation(lQuest2Animation);
    19. break;
    20. case R.id.next_next:
    21. layoutnext.startAnimation(rQuest1Animation);
    22. initMain();
    23. layoutmain.startAnimation(rQuest2Animation);
    24. break;
    25. }
    26. }
    27. };

Android 滑动效果进阶篇(五)—— 3D旋转的更多相关文章

  1. Android 滑动效果进阶篇(六)—— 倒影效果

    上篇介绍了使用Animation实现3D动画旋转翻页效果,现在介绍图片倒影实现,先看效果图 本示例主要通过自定义Gallery和ImageAdapter(继承自BaseAdapter)实现 1.倒影绘 ...

  2. Android 滑动效果入门篇(二)—— Gallery

    Gallery 是Android官方提供的一个View容器类,继承于AbsSpinner类,用于实现页面滑动效果. 从上面的继承关系可以看出,AbsSpinner类继承自AdapterView,因此我 ...

  3. Android 滑动效果入门篇(一)—— ViewFlipper

    ViewFilpper 是Android官方提供的一个View容器类,继承于ViewAnimator类,用于实现页面切换,也可以设定时间间隔,让它自动播放.又ViewAnimator继承至于Frame ...

  4. Android 滑动效果高级篇(八)—— 自定义控件

    自定义控件,较常用View.ViewGroup.Scroller三个类,其继承关系如下: 本示例自定义控件,实现一个Gallery效果,并添加了一个显示View个数和位置的bar条,效果图: 自定义控 ...

  5. Android 滑动效果基础篇(四)—— Gallery + GridView

    Android系统自带一个GridView和Gallery两个控件,GridView网格显示,Gallery单个浏览,两者结合起来可以真正实现Gallery浏览图片效果. 本示例通过GridView和 ...

  6. Android 滑动效果基础篇(三)—— Gallery仿图像集浏览

    Android系统自带一个Gallery浏览图片的应用,通过手指拖动时能够非常流畅的显示图片,用户交互和体验都很好. 本示例就是通过Gallery和自定义的View,模仿实现一个仿Gallery图像集 ...

  7. Android 滑动效果高级篇(七)—— 华丽翻页效果

    By 何明桂(http://blog.csdn.net/hmg25) 转载请注明出处 之前看到像ipad上的ibook的模拟书籍翻页的特效感觉很炫,在android上也有像laputa和ireader ...

  8. 十六、Android 滑动效果汇总

    Android 滑动效果入门篇(一)—— ViewFlipper Android 滑动效果入门篇(二)—— Gallery Android 滑动效果基础篇(三)—— Gallery仿图像集浏览 And ...

  9. Android 滑动效果汇总

    Android 滑动效果入门篇(一)—— ViewFlipper Android 滑动效果入门篇(二)—— Gallery Android 滑动效果基础篇(三)—— Gallery仿图像集浏览 And ...

随机推荐

  1. 根据给定的日期给 dateEdit 控件增加颜色

    private void dateEdit1_DrawItem(object sender, DevExpress.XtraEditors.Calendar.CustomDrawDayNumberCe ...

  2. 简易nagios安装

    这段时间一直在进行nagios安装的实验,进行了很多的实验,现在也就是将这些进行一些基础的记录. 本篇主要讲述的是进行nagios的简易安装,在安装完成之后,能够在web页面上看到本地的监控图像, n ...

  3. Android相关图书推荐

    疯狂Android讲义(第3版 附光盘) 作      者 李刚 著 出 版 社 电子工业出版社 出版时间 2015-06-01 版      次 3 页      数 780 印刷时间 2015-0 ...

  4. 发布 asp.net网站 到本地IIS

    http://blog.csdn.net/jiben2qingshan/article/details/9249139 概述 网站是由一个个页面组成的,是万维网具体的变现形式,关于万维网,网页的方面的 ...

  5. 简单的flash策略文件服务器!

    最近在做一个flash小游戏,众所周知,flash连接服务器socket的时候,需要向服务器请求策略文件.以下是一个简单的策略文件服务器的代码c++: #include <Winsock2.h& ...

  6. 如何在安裝SELinux的环境执行Quartus II

    (原創) 如何在安裝SELinux的環境執行Quartus II? (SOC) (Quartus II) (Linux) (RedHat) Abstract一般人安裝Linux時,也會同時安裝SELi ...

  7. Windows Azure Platform (一) 云计算的出现

    <Windows Azure Platform 系列文章目录> 最近的一年一直致力于微软云计算技术的推广和研究,对于微软的云计算平台Windows Azure Platform有一定的了解 ...

  8. Junit3.8

    使用Junit的最佳实践:新建一个名为test的source folder,用于存放测试类源代码目标类与测试类应该位于同一个包下面,这样测试类中就不必导入源代码所在的包,因为他们位于同一个包下面 测试 ...

  9. jira部署,主机迁移,数据库迁移,jira

    1,linux环境下快速部署; wget http://wpc.29c4.edgecastcdn.net/8029C4/downloads/software/jira/downloads/atlass ...

  10. 从使用到原理学习Java线程池

    线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收. 所 ...