前面介绍了利用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. 如何清除win7开机密码

    一.电脑已经登录到系统,但是忘记了密1对于这种情况是最简单的,其实只需要将密码取消就可以了右键单击桌面上我的电脑,选择管理即可进入计算机管理界面2依次展开系统工具--本地用户和组--用户,在右侧选择要 ...

  2. lightoj 1022

    直接算即可,特别要注意精度 #include<cstdio> #include<cmath> int main(){ int t, CASE(0); double r; sca ...

  3. 《Python CookBook2》 第一章 文本 - 去字符串两端的空格 && 合并字符串 && 将字符串逐字符或者逐词反转

    去字符串两端的空格 任务: 获得一个开头和末尾都没有多余空格的字符串. 解决方案: 字符串对象的lstrip.rstrip和strip 方法正是为这种任务而设计的.这几个方法都不需要参数,它们会直接返 ...

  4. 《零成本实现Web自动化测试--基于Selenium》第二章 Selenium简介和基础

    第一部分 Selenium简介 1.Selenium 组建 1.1 Selenium-IDE Selenium-IDC是开发Selenium测试案例的集成开发环境.它像FireFox插件一样的工作,支 ...

  5. Ruby多字节字符的设计

    Perl.Python的多字节字符处理方式是UCS(Universal Code Set),Ruby的多字节字符处理方式是CSI(Code Set Independent).UCS的做法是,不管你读取 ...

  6. J2SE7规范_2013.2_类

    8.1 类的定义   包括普通类和枚举类,枚举(略) 下面都是指普通类:   public只能用于外部类,成员类,不能用于局部类,匿名类 protected和private用于成员类时(待解) sta ...

  7. Linux重复执行上条命令

    Linux系统下Shell重复执行上条命令的 4 种方法: 1.使用上方向键,并回车执行.2.按 !! 并回车执行.3.输入 !-1 并回车执行.4.按 Ctrl+P 并回车执行.

  8. matplotlib绘制三维图

    本文参考官方文档:http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html 起步 新建一个matplotlib.figure.Figure对象, ...

  9. librtmp推流使用aac编码音频的html5和flash播放问题

    公司项目中使用rtmp推流,音频编码aac.视频编码H264.windows和android平台都没有发现问题.然而在IOS版本的APP中发现几个问题:1. 推流后flash播放异常2. IOS平台微 ...

  10. Getting Started with Entity Framework 6 Code First using MVC 5--Contoso 大学

    在本教程中使用的软件版本 Visual Studio 2013 年 4.5.NET 实体框架 (EntityFramework 6.1.0 NuGet 包) 6 Windows Azure SDK 2 ...