android3d动画的实现,Android 3D旋转动画库
今天兴趣来潮,撸了一个动画特效,我把他应用在登录的界面,当然也可以用在其他地方,先来预览一下我的特效吧
预览.gif
使用方法
在build.gradle里面配置如下
dependencies {
compile 'com.jzp:rotate3D:1.0.0'
}
生成一个Rotate3D对象
Rotate3D anim = new Rotate3D.Builder(this)
.bindParentView(parent_ll)
.bindPositiveView(account_login_ll)
.bindNegativeView(account_phone_ll)
.create();
这里面必须要设置的参数是bindParentView,bindPositiveView,bindNegativeView,这些分别是父类View,正面View,以及旋转后的反面View,有提供可选参数
setDuration 设置动画时间
setDepthZ 设置Z轴深度
可选参数未设置的话就使用默认的
启动动画
anim.transform();
实现原理
由于android提供的动画 alpha(淡入淡出),translate(位移),scale(缩放大小),rotate(旋转),这些都是平面上的动画,那想要做3D立体的动画,我们就需要从写animation,3D立体动画用到android的Camera库,Camera提供了三种旋转方法:
rotateX()
rotateY()
rotateX()
调用这三种方法,传入旋转角度参数,即可实现视图沿着坐标轴旋转的功能。
实现的核心代码
public class Rotate3dAnimation extends Animation {
private final float mFromDegrees;
private final float mToDegrees;
private final float mCenterX;
private final float mCenterY;
private final float mDepthZ;
private final boolean mReverse;
private Camera mCamera;
float scale = 1; // 像素密度
/**
* 创建一个绕 y 轴旋转的3D动画效果,旋转过程中具有深度调节,可以指定旋转中心。
*
* @param context 上下文,用于获取像素密度
* @param fromDegrees 起始时角度
* @param toDegrees 结束时角度
* @param centerX 旋转中心x坐标
* @param centerY 旋转中心y坐标
* @param depthZ 最远到达的z轴坐标
* @param reverse true 表示由从0到depthZ,false相反
*/
public Rotate3dAnimation(Context context, float fromDegrees, float toDegrees,
float centerX, float centerY, float depthZ, boolean reverse) {
mFromDegrees = fromDegrees;
mToDegrees = toDegrees;
mCenterX = centerX;
mCenterY = centerY;
mDepthZ = depthZ;
mReverse = reverse;
// 获取手机像素密度 (即dp与px的比例)
scale = context.getResources().getDisplayMetrics().density;
}
@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 fromDegrees = mFromDegrees;
float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);
final float centerX = mCenterX;
final float centerY = mCenterY;
final Camera camera = mCamera;
final Matrix matrix = t.getMatrix();
camera.save();
// 调节深度
if (mReverse) {
camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime);
} else {
camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime));
}
// 绕y轴旋转
camera.rotateY(degrees);
camera.getMatrix(matrix);
camera.restore();
// 修正失真
float[] mValues = new float[9];
matrix.getValues(mValues); //获取数值
mValues[6] = mValues[6] / scale; //数值修正
mValues[7] = mValues[7] / scale; //数值修正
matrix.setValues(mValues); //重新赋值
// 调节中心点,旋转中心默认是坐标原点,对于图片来说就是左上角位置。
matrix.preTranslate(-centerX, -centerY); // 使用pre将旋转中心移动到和Camera位置相同
matrix.postTranslate(centerX, centerY); // 使用post将图片(View)移动到原来的位置
}
}
总结
代码中的作用我都有写注释,所以在这里就不多解释了,有的时候,我们看一些特效觉得做起来一定很麻烦,其实只要你掌握其实现原理,并不是很难,所以给大家一句忠告,多读源码,对技术的提升很有帮助。
Github源码下载:3D旋转动画库
android3d动画的实现,Android 3D旋转动画库相关推荐
- Android 3D旋转动画库
今天兴趣来潮,撸了一个动画特效,我把他应用在登录的界面,当然也可以用在其他地方,先来预览一下我的特效吧 使用方法 1. 在build.gradle里面配置如下 dependencies {compil ...
- Android3D旋转动画库--Rotate3D
运行效果: 使用方法: 在build.gradle中添加依赖: implementation 'com.jzp:rotate3D:1.0.0' 创建Rotate3D: Rotate3D anim = ...
- python安装vpython_VPython:一个Python的3D图形动画库+被忽略的数据可视化功能
1 说明: ===== 1.1 VPython是一套简单易用的三维图形库,使用它可以快速创建三维场景和动画. 1.2 VPython 是python默认的3D模块,与PyOpenGL相比,容易上手,无 ...
- lottie-android: 【Android】开源动画库(Airbnb开源)
Lottie支持Android.iOS.React Native平台,支持实时渲染After Effects动画,使得app中使用动画可以像使用静态资源一样简单. dependencies {impl ...
- python做动画的库_用matplotlib动画库制作等分法动画
经过反复试验,我找到了解决问题的办法.在import matplotlib.pyplot as plt from matplotlib import animation import numpy as ...
- android动画帧率_Android动画进阶—使用开源动画库nineoldandroids
前言 Android系统支持原生动画,这为应用开发者开发绚丽的界面提供了极大的方便,有时候动画是很必要的,当你想做一个滑动的特效的时候,如果苦思冥想都搞不定,那么你可以考虑下动画,说不定动画轻易就搞定 ...
- JavaScript、Vue实现大数据大屏展示3D旋转动画效果
效果 最近在写一些数据大屏的时候客户需要做个3D旋转动效的效果,简单整理之后写了一个小demo做下记录,先看一下效果: 当点击next的时候,整个模块旋转切换到下个菜单,点击prev的时候也可以切换到 ...
- react-native系列(13)动画篇:Animated动画库和LayoutAnimation布局动画详解
动画概念了解 流畅.有意义的动画对于APP户体验来说是非常重要的,用RN开发实现动画有三种方法: requestAnimationFrame:称为帧动画,原理是通过同步浏览器的刷新频率不断重新渲染界面 ...
- html中如何设置动画鼠标,使用animate动画库添加鼠标经过动画
使用animate动画库添加鼠标经过动画 蓝叶 网站设计 2016-11-27 11679 4评论 animate是一个css3动画库,使用它简单几步就能很轻松的为网站增加各种 ...
- vue动画库-Animate.css的使用以及部分问题
vue动画库-Animate.css的使用以及部分问题 Animate.css在vue脚手架中的使用 详情见官网: Animate.css | A cross-browser library of C ...
最新文章
- 2022-2028年中国塑料导爆管行业市场调查研究及前瞻分析报告
- DevExpress.XtraReports打印
- 1013 Battle Over Cities(图的DFS解法)
- php等待程序时间,php页面程序运行需要时间,怎么给客户提示?
- 指针-数组传参,指针传参
- C#完整执行存储过程的代码加实例
- 互联网时代的应用设计,互联网营销
- 关于特殊的LCS问题的优化
- CPU特性标志及含义
- Java Map遍历方式的选择
- Maven构建springBoot Demo案例
- 深度学习基础系列(六)| 权重初始化的选择
- 简单理解javascript中的原型对象,实现对之间共享属性和行为
- java环境变量配置不成功,已经解决
- springboot项目启动报Ambiguous mapping. Cannot map ‘xxxController‘ method
- 未能找到使用主机名称的服务器,未能找到使用指定主机名称的服务器
- el-scrollbar 优化滚动条样式
- 《从0开始做运营》(有感)
- 配置多SessionFactory
- JBOSS4.0.2集群配置
热门文章
- 【windows10】宽带拨号连接报错720的解决办法
- 集成百度街景报错Error inflating class com.baidu.lbsapi.panoramaview.PanoramaView
- faiss-3: 基础模块
- SRAM VS DRAM
- java mybatis (批量) 插入实体报多个问号
- 佳能2900打印机与win10不兼容_windows10系统64位如何安装佳能LBP2900驱动?
- 基于Spring Boot的宠物猫店管理系统的设计与实现毕业设计源码140909
- matlab中abs函数,matlab 中的abs函数什么意思 编程知识
- 小米手机miui12系统连接数据线usb共享网络方法
- 添加打印机无法搜索计算机,添加打印机时搜索不到如何解决 电脑搜不到打印机设备的处理办法...