本文实例讲述了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

android:id="@+id/layout_main"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:orientation="vertical">

...

next.xml

android:id="@+id/layout_next"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:orientation="vertical">

...

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

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

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程序设计有所帮助。

android 滑动翻转动画,Android编程实现3D滑动旋转效果的方法相关推荐

  1. android局部翻转动画,android实现图片翻转动画

    效果如下(gif1): 怎么做呢?文章有点长,看官请静下心来好好看看.碰到不懂的地方查查API. Android中并没有提供直接做3D翻转的动画,所以关于3D翻转的动画效果需要我们自己实现,那么我们首 ...

  2. android局部翻转动画,android 围绕中心旋转动画

    本文主要介绍Android中如何使用rotate实现图片不停旋转的效果.Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移.缩放.旋转)产生动画效果 ...

  3. Android 卡片翻转动画效果

    转载请标明出处:http://blog.csdn.net/android_mnbvcxz/article/details/78570594 Android 卡片翻转动画效果 前言 前端时间开发一款应用 ...

  4. android 滑动缩放监听,基于Android的ViewPager动画特效实现页面左右滑动效果(实现缩放...

    基于Android的ViewPager动画特效实现页面左右滑动效果(实现缩放 基于Android的ViewPager动画特效实现页面左右滑动效果(实现缩放和透明效果) 在上一个项目的基础上做修改,项目 ...

  5. android3d编程,Android编程实现3D立体旋转效果的实例代码

    说明:之前在网上到处搜寻类似的旋转效果 但搜到的结果都不是十分满意 原因不多追述(如果有人找到过相关 比较好的效果 可以发一下连接 一起共同进步) 一 效果展示 : 如非您所需要的效果 也希望能给些微 ...

  6. android 卡片旋转动画,Android 卡片翻转效果

    Android 卡片翻转效果使用的Cramre来完成 记录一下: 一个好用的3D旋转工具类 oid.graphics.Matrix; import android.util.Log; import a ...

  7. android 仿搜索动画,Android仿京东顶部搜索框滑动伸缩动画效果

    最近使用京东发现,京东顶部的搜索框有一个新的伸缩效果,根据用户的手势滑动,伸缩搜索框.觉得效果还不错,就看了下其他的应用有没有这种伸缩的效果,发现安居客也使用了类似的一种效果,然后就想着实现这样的一种 ...

  8. android 硬币翻转动画,使用Android标准动画显示正在翻转的硬币的两面

    我非常接近制作"硬币翻转"动画,但是由于当前动画系统的局限性(错误?) – 我无法找到一种方法来显示硬币在空中翻转的两侧. 例如,我有以下动画.XML: android:share ...

  9. Android卡片滑动切换动画,Android原生ViewPager控件实现卡片翻动效果

    本文实例为大家分享了Android控件ViewPager实现卡片翻动效果的具体代码,供大家参考,具体内容如下 先放一张效果图: 想要实现这样的效果其实并不是太难,需要对ViewPager的一些细节属性 ...

最新文章

  1. Android沉浸式模式状态栏(二)
  2. 【鸿蒙 HarmonyOS】UI 布局 ( 相对布局 DependentLayout )
  3. linux的 0号进程(idle进程) 和 1 号进程(init进程)
  4. 管理信息系统 课程设计(2018-6-16)
  5. 【杂谈】2020年如何长期、系统,全面地学习深度学习和计算机视觉,这是有三AI的完整计划...
  6. ftp 上传文件夹_ftp工具哪个好?Viper FTP for Mac激活版带给大家
  7. 码农30多岁,要被辞退的时候 怎么办?
  8. 安卓:android.process.media意外停止解决方法
  9. 009 HDFS的shell命令(里面有一个安全模式)
  10. 订阅发布延时_Redis实时队列和延时队列的php实现
  11. 华为HCNA好考吗?
  12. photoshop实现图片更换背景
  13. Asio驱动开发学习笔记(2)
  14. JESD204B 协议解析和参数理解
  15. python 使用多个elif代码块 计算阶梯电费
  16. 机器学习在网络安全领域的应用(一)
  17. 100元 50元 20元 10元 5元 1元 标准尺寸
  18. 如何利用GPT来发论文!!
  19. proe5.0管道管线设计教程
  20. MySQL命令启动与关闭服务

热门文章

  1. 在sqlServer中把数据导出为insert脚本
  2. phonegap安装 环境搭建与配置详解(3.4 完整版 提供下载地址)
  3. 表字段identity
  4. 知道一点怎么设直线方程_直线初步
  5. python控制台进度条_python在控制台输出进度条的方法
  6. python去重复功能_python包中的statmodels,如何处理完全重复的功能?
  7. java编程技巧_Java编程技巧
  8. seata分布式事务原理_又见分布式事务之Seata
  9. 详解Python中的生成器表达式(generator expression)
  10. Python绘制带标记和箭头的树结构