当前位置: 首页 > news >正文

Android 属性动画及自定义3D旋转动画

Android 动画框架

其中包括,帧动画、视图动画(补间动画)、属性动画。

在Android3.0之前,视图动画一家独大,之后属性动画框架被推出。属性动画框架,基本可以实现所有的视图动画效果。

视图动画的效率较高且使用方便。但是相比属性动画,视图动画一个非常大的缺陷就是不具备交互性。当某个元素发生视图动画后,其响应事件的位置还依然在动画前的地方,所以视图动画只能做普通的动画效果,避免交互发生。

书接上篇:Android 动画之视图动画的使用


Animator 属性动画

其拥有ObjectAnimator单个动画和AnimatorSet动画集两个类。

使用 ObjectAnimator 可以控制单个View的某个属性值的变化,而将多个 ObjectAnimator 组合到一起就可以形成一个 AnimatorSet 动画集合。

ObjectAnimator

ObjectAnimator可以调用 setFrameDelay(longframeDelay) 设置动画帧之间的间隙时间,通过调整帧率的方式减少动画过程中频繁绘制界面。从而在不影响动画效果的前提下减少CPU资源消耗。

最重要的是,属性动画通过属性的get、set方法来真实地控制一个View的属性值。使用方法如下:

  • translationX和translationY:控制着View从布局容器的左上角坐标偏移的位置;
ObjectAnimator animator=ObjectAnimator.ofFloat(view,"translationX",300);
animator.setDuration(300);
animator.start();
  • pivotX 和 privotY:控制着View的支点位置,默认支点为View的中心; 
  • rorationX 和 rorationY :控制View围绕支点进行2D和3D旋转;
  • scaleX 和 scaleY:控制着View围绕它的支点进行2D缩放;
  • alpha:控制View的alpha透明度。默认值1不透明,0完全透明。

监听事件

ObjectAnimator anima =ObjectAnimator.ofFloat(View,"alpha",0.5f);
anima.addListener(new AnimatorListener(){@Overriderpublic void onAnimationStart(Animator animation){//开始}@Overriderpublic void onAnimationRepeat(Animator animation){ //重复}@Overriderpublic void onAnimationEnd(Animator animation){//结束 }@Overriderpublic void onAnimationCancel(Animator animation){ //取消 }
});
anima.start();

也可以进行选择,单个事件进行监听:

anima.addListener(new AnimatorListenerAdapter(){@Overridepublic void onAnimationEnd(Animator animation){//结束}
});

AnimatorSet

AnimatoSet 可以通过 playTogether()、playSequentially()、animSet.play().with()、before()、after(),来控制多个动画的协同工作方式,从而做到对动画播放顺序的控制。

ObjectAnimator animator1 =ObjecteAnimator.ofFloat(view,"translation",300f);
ObjectAnimator animator1 =ObjecteAnimator.ofFloat(view,"scaleX",1);
ObjectAnimator animator1 =ObjecteAnimator.ofFloat(view,"scaleY",1);
AnimatorSet set=new AnimatorSet();
set.setDuration(1000);
set.playTogether(animator1,animator2,animator3);//同时播放动画
set.start();

自定义动画

通过继承Animation类,重写其动画的方法实现。

其中一个关键方法如下:

applyTransformation(float interpolatedTime ,transformation t)
  • interpolatedTime:插值器的时间因子,取值范围为0~1 之间;
  • transformation :矩阵封装类,使用它获取矩阵对象getMatrix();

案例,模拟电视机关闭效果的动画来初步了解自定义动画。代码实现如下:

/*** Created by aiyang on 2018/5/28.*/
public class CustomTV extends Animation {private int mCenterWidth;private int mCenterHeight;private Camera camera=new Camera();@Overridepublic void initialize(int width, int height, int parentWidth, int parentHeight) {super.initialize(width, height, parentWidth, parentHeight);setDuration(2000);setFillAfter(false);setRepeatCount(3);setInterpolator(new AccelerateInterpolator());//缩放的中心位置mCenterWidth = width/2;mCenterHeight = height/2;}@Overrideprotected void applyTransformation(float interpolatedTime, Transformation t) {final Matrix matrix=t.getMatrix();//让一个图像纵向比例不断缩小就能实现电视机关闭的效果matrix.preScale(1,1-interpolatedTime,mCenterWidth,mCenterHeight);}
}

自定义3D动画

结合矩阵Matrix,并使用 Camera 类可以实现一个自定义的3D动画效果。

这里的Camera并非系统相机类,而是指的是android.graphics.Camera 中的 Camera 类,它封装了openGL的3D动画,从而可以非常方便的创建3D动画效果。

接上面的代码进行修改,如下:

/*** Created by aiyang on 2018/5/28.*/
public class CustomAnim extends Animation {private int mCenterWidth;private int mCenterHeight;private Camera mCamera = new Camera();private float mRotateY = 0.0f;@Overridepublic void initialize(int width, int height, int parentWidth, int parentHeight) {super.initialize(width, height, parentWidth, parentHeight);setDuration(3000);setFillAfter(true);setRepeatCount(3);setInterpolator(new BounceInterpolator());mCenterWidth = width / 2;mCenterHeight = height / 2;}//暴露接口,设置旋转角度public void setRotateY(float rotateY){mRotateY=rotateY;}@Overrideprotected void applyTransformation(float interpolatedTime, Transformation t) {final Matrix matrix=t.getMatrix();mCamera.save();//使用Camera设置旋转的角度mCamera.rotateY(mRotateY*interpolatedTime);//将旋转变换作用到Matrix上mCamera.getMatrix(matrix);mCamera.restore();//通过pre方法设置矩阵作用前的偏移量来改变旋转中心matrix.preTranslate(mCenterWidth,mCenterHeight);matrix.postTranslate(-mCenterWidth,-mCenterHeight);}
}

代码调用

 CustomAnim anim = new CustomAnim();anim.setRotateY(10);textView.setText("推开门");textView.startAnimation(anim);

当然,根据对属性动画的知识学习,我们知道属性动画可以支持3D旋转:

即rorationX 和 rorationY :控制View围绕支点进行2D和3D旋转;

相关文章:

  • C语言什么是指针? 什么是指针变量?
  • C++之STL整理(8)之stack用法(创建、赋值、增删查改)详解
  • 【Android】【root remount】【2】如何判断设备是否remount
  • 接口自动化测试(python+pytest+requests)
  • 工业视觉AI应用总结记录
  • AI日报:GPT-4-Turbo正式版自带读图能力;Gemini1.5Pro开放API;SD3将于4月中旬发布;抖音宫崎骏AI特效爆火
  • String类(1)
  • 动手学习深度学习(李沐)
  • Java项目:基于SSM+vue框架实现的人力资源管理系统设计与实现(源码+数据库+毕业论文+任务书)
  • 前端使用minio传输文件
  • Java Set基础篇
  • Linux(CentOS7)安装 Docker 以及 Docker 基本使用教程
  • 在unbuntu服务器上使用nginx+uwsgi部署django项目
  • 领鸡蛋游戏养鸡游戏淘宝客源码广告联盟
  • 活动预告|NineData 创始人CEO叶正盛将参加QCon全球软件开发大会,共话AI大模型技术在数据库DevOps的实践
  • [deviceone开发]-do_Webview的基本示例
  • [数据结构]链表的实现在PHP中
  • 4. 路由到控制器 - Laravel从零开始教程
  • ES6之路之模块详解
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript 奇技淫巧
  • Javascript弹出层-初探
  • JavaScript服务器推送技术之 WebSocket
  • Joomla 2.x, 3.x useful code cheatsheet
  • MySQL几个简单SQL的优化
  • Protobuf3语言指南
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Wamp集成环境 添加PHP的新版本
  • WePY 在小程序性能调优上做出的探究
  • 官方解决所有 npm 全局安装权限问题
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 设计模式走一遍---观察者模式
  • 问题之ssh中Host key verification failed的解决
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 小程序开发之路(一)
  • 小试R空间处理新库sf
  • ​马来语翻译中文去哪比较好?
  • ​业务双活的数据切换思路设计(下)
  • ​油烟净化器电源安全,保障健康餐饮生活
  • "无招胜有招"nbsp;史上最全的互…
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #pragam once 和 #ifndef 预编译头
  • $jQuery 重写Alert样式方法
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (libusb) usb口自动刷新
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (力扣)1314.矩阵区域和
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (转)菜鸟学数据库(三)——存储过程
  • .apk 成为历史!
  • .libPaths()设置包加载目录