android 滑动翻转动画,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
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滑动旋转效果的方法相关推荐
- android局部翻转动画,android实现图片翻转动画
效果如下(gif1): 怎么做呢?文章有点长,看官请静下心来好好看看.碰到不懂的地方查查API. Android中并没有提供直接做3D翻转的动画,所以关于3D翻转的动画效果需要我们自己实现,那么我们首 ...
- android局部翻转动画,android 围绕中心旋转动画
本文主要介绍Android中如何使用rotate实现图片不停旋转的效果.Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移.缩放.旋转)产生动画效果 ...
- Android 卡片翻转动画效果
转载请标明出处:http://blog.csdn.net/android_mnbvcxz/article/details/78570594 Android 卡片翻转动画效果 前言 前端时间开发一款应用 ...
- android 滑动缩放监听,基于Android的ViewPager动画特效实现页面左右滑动效果(实现缩放...
基于Android的ViewPager动画特效实现页面左右滑动效果(实现缩放 基于Android的ViewPager动画特效实现页面左右滑动效果(实现缩放和透明效果) 在上一个项目的基础上做修改,项目 ...
- android3d编程,Android编程实现3D立体旋转效果的实例代码
说明:之前在网上到处搜寻类似的旋转效果 但搜到的结果都不是十分满意 原因不多追述(如果有人找到过相关 比较好的效果 可以发一下连接 一起共同进步) 一 效果展示 : 如非您所需要的效果 也希望能给些微 ...
- android 卡片旋转动画,Android 卡片翻转效果
Android 卡片翻转效果使用的Cramre来完成 记录一下: 一个好用的3D旋转工具类 oid.graphics.Matrix; import android.util.Log; import a ...
- android 仿搜索动画,Android仿京东顶部搜索框滑动伸缩动画效果
最近使用京东发现,京东顶部的搜索框有一个新的伸缩效果,根据用户的手势滑动,伸缩搜索框.觉得效果还不错,就看了下其他的应用有没有这种伸缩的效果,发现安居客也使用了类似的一种效果,然后就想着实现这样的一种 ...
- android 硬币翻转动画,使用Android标准动画显示正在翻转的硬币的两面
我非常接近制作"硬币翻转"动画,但是由于当前动画系统的局限性(错误?) – 我无法找到一种方法来显示硬币在空中翻转的两侧. 例如,我有以下动画.XML: android:share ...
- Android卡片滑动切换动画,Android原生ViewPager控件实现卡片翻动效果
本文实例为大家分享了Android控件ViewPager实现卡片翻动效果的具体代码,供大家参考,具体内容如下 先放一张效果图: 想要实现这样的效果其实并不是太难,需要对ViewPager的一些细节属性 ...
最新文章
- Android沉浸式模式状态栏(二)
- 【鸿蒙 HarmonyOS】UI 布局 ( 相对布局 DependentLayout )
- linux的 0号进程(idle进程) 和 1 号进程(init进程)
- 管理信息系统 课程设计(2018-6-16)
- 【杂谈】2020年如何长期、系统,全面地学习深度学习和计算机视觉,这是有三AI的完整计划...
- ftp 上传文件夹_ftp工具哪个好?Viper FTP for Mac激活版带给大家
- 码农30多岁,要被辞退的时候 怎么办?
- 安卓:android.process.media意外停止解决方法
- 009 HDFS的shell命令(里面有一个安全模式)
- 订阅发布延时_Redis实时队列和延时队列的php实现
- 华为HCNA好考吗?
- photoshop实现图片更换背景
- Asio驱动开发学习笔记(2)
- JESD204B 协议解析和参数理解
- python 使用多个elif代码块 计算阶梯电费
- 机器学习在网络安全领域的应用(一)
- 100元 50元 20元 10元 5元 1元 标准尺寸
- 如何利用GPT来发论文!!
- proe5.0管道管线设计教程
- MySQL命令启动与关闭服务
热门文章
- 在sqlServer中把数据导出为insert脚本
- phonegap安装 环境搭建与配置详解(3.4 完整版 提供下载地址)
- 表字段identity
- 知道一点怎么设直线方程_直线初步
- python控制台进度条_python在控制台输出进度条的方法
- python去重复功能_python包中的statmodels,如何处理完全重复的功能?
- java编程技巧_Java编程技巧
- seata分布式事务原理_又见分布式事务之Seata
- 详解Python中的生成器表达式(generator expression)
- Python绘制带标记和箭头的树结构