今天兴趣来潮,撸了一个动画特效,我把他应用在登录的界面,当然也可以用在其他地方,先来预览一下我的特效吧

预览.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旋转动画库相关推荐

  1. Android 3D旋转动画库

    今天兴趣来潮,撸了一个动画特效,我把他应用在登录的界面,当然也可以用在其他地方,先来预览一下我的特效吧 使用方法 1. 在build.gradle里面配置如下 dependencies {compil ...

  2. Android3D旋转动画库--Rotate3D

    运行效果: 使用方法: 在build.gradle中添加依赖: implementation 'com.jzp:rotate3D:1.0.0' 创建Rotate3D: Rotate3D anim = ...

  3. python安装vpython_VPython:一个Python的3D图形动画库+被忽略的数据可视化功能

    1 说明: ===== 1.1 VPython是一套简单易用的三维图形库,使用它可以快速创建三维场景和动画. 1.2 VPython 是python默认的3D模块,与PyOpenGL相比,容易上手,无 ...

  4. lottie-android: 【Android】开源动画库(Airbnb开源)

    Lottie支持Android.iOS.React Native平台,支持实时渲染After Effects动画,使得app中使用动画可以像使用静态资源一样简单. dependencies {impl ...

  5. python做动画的库_用matplotlib动画库制作等分法动画

    经过反复试验,我找到了解决问题的办法.在import matplotlib.pyplot as plt from matplotlib import animation import numpy as ...

  6. android动画帧率_Android动画进阶—使用开源动画库nineoldandroids

    前言 Android系统支持原生动画,这为应用开发者开发绚丽的界面提供了极大的方便,有时候动画是很必要的,当你想做一个滑动的特效的时候,如果苦思冥想都搞不定,那么你可以考虑下动画,说不定动画轻易就搞定 ...

  7. JavaScript、Vue实现大数据大屏展示3D旋转动画效果

    效果 最近在写一些数据大屏的时候客户需要做个3D旋转动效的效果,简单整理之后写了一个小demo做下记录,先看一下效果: 当点击next的时候,整个模块旋转切换到下个菜单,点击prev的时候也可以切换到 ...

  8. react-native系列(13)动画篇:Animated动画库和LayoutAnimation布局动画详解

    动画概念了解 流畅.有意义的动画对于APP户体验来说是非常重要的,用RN开发实现动画有三种方法: requestAnimationFrame:称为帧动画,原理是通过同步浏览器的刷新频率不断重新渲染界面 ...

  9. html中如何设置动画鼠标,使用animate动画库添加鼠标经过动画

    使用animate动画库添加鼠标经过动画 蓝叶    网站设计    2016-11-27    11679    4评论 animate是一个css3动画库,使用它简单几步就能很轻松的为网站增加各种 ...

  10. vue动画库-Animate.css的使用以及部分问题

    vue动画库-Animate.css的使用以及部分问题 Animate.css在vue脚手架中的使用 详情见官网: Animate.css | A cross-browser library of C ...

最新文章

  1. 2022-2028年中国塑料导爆管行业市场调查研究及前瞻分析报告
  2. DevExpress.XtraReports打印
  3. 1013 Battle Over Cities(图的DFS解法)
  4. php等待程序时间,php页面程序运行需要时间,怎么给客户提示?
  5. 指针-数组传参,指针传参
  6. C#完整执行存储过程的代码加实例
  7. 互联网时代的应用设计,互联网营销
  8. 关于特殊的LCS问题的优化
  9. CPU特性标志及含义
  10. Java Map遍历方式的选择
  11. Maven构建springBoot Demo案例
  12. 深度学习基础系列(六)| 权重初始化的选择
  13. 简单理解javascript中的原型对象,实现对之间共享属性和行为
  14. java环境变量配置不成功,已经解决
  15. springboot项目启动报Ambiguous mapping. Cannot map ‘xxxController‘ method
  16. 未能找到使用主机名称的服务器,未能找到使用指定主机名称的服务器
  17. el-scrollbar 优化滚动条样式
  18. 《从0开始做运营》(有感)
  19. 配置多SessionFactory
  20. JBOSS4.0.2集群配置

热门文章

  1. 【windows10】宽带拨号连接报错720的解决办法
  2. 集成百度街景报错Error inflating class com.baidu.lbsapi.panoramaview.PanoramaView
  3. faiss-3: 基础模块
  4. SRAM VS DRAM
  5. java mybatis (批量) 插入实体报多个问号
  6. 佳能2900打印机与win10不兼容_windows10系统64位如何安装佳能LBP2900驱动?
  7. 基于Spring Boot的宠物猫店管理系统的设计与实现毕业设计源码140909
  8. matlab中abs函数,matlab 中的abs函数什么意思 编程知识
  9. 小米手机miui12系统连接数据线usb共享网络方法
  10. 添加打印机无法搜索计算机,添加打印机时搜索不到如何解决 电脑搜不到打印机设备的处理办法...