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旋转;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/804353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【第七篇】使用BurpSuite进行主动、被动扫描和主动、被动爬虫

文章目录 前言主动扫描被动扫描主动爬虫被动爬虫前言 Burp Scanner 既可以用作全自动扫描仪,也可以用作增强手动测试工作流程的强大手段。 扫描网站涉及两个阶段: 抓取内容和功能: Burp Scanner 首先在目标站点周围导航,密切反映真实用户的行为。它对站点的结构和内容以及…

数字社会下的智慧公厕:构筑智慧城市的重要组成部分

智慧城市已经成为现代城市发展的趋势,而其中的数字化转型更是推动未来社会治理体系和治理能力现代化的必然要求。在智慧城市建设中,智慧公厕作为一种新形态的信息化公共厕所,扮演着重要角色。本文智慧公厕源头实力厂家广州中期科技有限公司&a…

【攻防世界】web2(逆向解密)

进入题目环境&#xff0c;查看页面信息&#xff1a; <?php $miwen"a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";function encode($str){$_ostrrev($str);// echo $_o;for($_00;$_0<strlen($_o);$_0){$_csubstr($_o,$_0,1);$__ord($_c)1;…

【学习总结】Python transformers 预处理 SQuAD 数据集,并展示

1. 数据介绍 SQuAD 官网 SQuAD&#xff08;Stanford Question Answering Dataset&#xff09;是由斯坦福大学开发的一个广泛使用的机器阅读理解数据集。它被用于训练和评估问答系统&#xff0c;旨在测试模型对自然语言文本中的问题和答案的理解能力。 详细介绍 : SQuAD数据集…

龙蜥社区「人人都可以参与开源」——体验开源成为“开源人“

龙蜥社区「人人都可以参与开源」体验开源——让更多的人了解开源&#xff01; 龙蜥社区开源概述&#xff1a;龙蜥社区开源的探索过程:龙蜥社区收获总结:AtomGit评测:服务设计上:功能结构上:安全设计上: AtomGit测评总结: 龙蜥社区开源概述&#xff1a; 在追求技术的路上少不了…

[vue] v-viewer 点击失效 图片有更新

rebuild 当图片发生变更时(添加、删除或排序)&#xff0c;viewer实例会使用update方法更新内容。 写法1 <div class"images" v-viewer.rebuild><img v-for"src in images" :src"src" :key"src"> </div>写法2 &l…

铸造大型基础平板的结构应该怎样设计

设计大型基础平板的结构时&#xff0c;需要考虑以下几个方面&#xff1a; 地质条件&#xff1a;首先要了解工程所在地的地质条件&#xff0c;包括土质、地下水位、地震状况等。根据地质条件来选择合适的基础类型&#xff0c;如浅基、深基或地下连续墙等。 荷载分析&#xff1a…

linux c共享内存和信号量

编译环境&#xff1a;Ubuntu16.04 64位 交叉编译工具&#xff1a;arm-hisiv500-linux-gcc 文章目录 1. 项目背景2. 涉及的函数3. 头文件JShm.h4. 类的实现5. sample代码 1. 项目背景 最近项目中需要用到共享内存的交互&#xff0c;自己造个轮子吧。 2. 涉及的函数 详细描述可…

Linux进阶之旅:深入探索Linux的高级功能

文章目录 Linux进阶之旅:深入探索Linux的高级功能1. Shell脚本编程2. 进程管理3. 网络管理4. 文本处理5. 系统监控6. 总结 Linux进阶之旅:深入探索Linux的高级功能 在上一篇博客中,我们对Linux操作系统进行了入门级的介绍,包括Linux的特点、发行版、安装方法以及基本使用。接下…

python——输入/输出

输出 关键字 print()注意&#xff1a;print() 默认自带一个换行符\n 格式化输出 格式化符号 符号作用%s转换字符串%d有符号的十进制整数%f浮点数%c字符%u无符号的十进制整数%o八进制整数%x十六进制整数&#xff0c;小写ox%X十六进制整数&#xff0c;大写OX%e科学计数法&…

Proxmox VE qm 方式一键创建Windows虚拟机

前言 实现qm 方式一键创建Windows虚拟机&#xff0c;提高效率。 qm 一键创建Windows虚拟机 以下实现在线下载镜像&#xff0c;创建虚拟机&#xff0c;安装系统需要自己手动安装哦&#xff0c;如果想实现全自动安装系统&#xff0c;建议部署自己的内网pxe server 系统参考各参…

(一)ffmpeg 入门基础知识

一、ffmpeg FFmpeg是一套强大的开源音视频处理工具&#xff0c;能够录制、转换以及流化音视频内容。 FFmpeg是开源的&#xff0c;这意味着它的源代码是公开的&#xff0c;允许任何人使用、修改和分发。它提供了录制、转换以及流化音视频的完整解决方案&#xff0c;支持多种格…

【C语言】整数和浮点数在内存中的存储

点这里是个人主页~ 这次的内容是比较底层的奥&#xff0c;对于理解编程很重要~ 整数浮点数在内存中的存储 一、 整数在内存中的存储二、大小端字节序和字节序判断大小端的概念一道简单关于大小端排序的百度面试题 三、简单理解数据类型存储范围例一例二例三例四例五例六 四、 …

STM32F4 IAP跳转APP问题及STM32基于Ymodem协议IAP升级笔记

STM32F4 IAP 跳转 APP问题 ST官网IAP例程Chapter1 STM32F4 IAP 跳转 APP问题1. 概念2. 程序2.1 Bootloader 程序 问题现象2.2. APP程序 3. 代码4. 其他问题 Chapter2 STM32-IAP基本原理及应用 | ICP、IAP程序下载流程 | 程序执行流程 | 配置IAP到STM32F4xxxChapter3 STM32基于Y…

未来工厂大脑:图扑组态软件在智能制造中的应用

组态软件&#xff1a;一般英文简称有三种分别为 HMI/MMI/SCADA&#xff0c;中文翻译为&#xff1a;人机界面/监视控制和数据采集软件。 运行于 PC 平台的一个通用工具软件&#xff0c;涉及各行各业&#xff0c;其主要功能是对生产现场的运行设备进行监控并就危险情况进行报警&…

【学习】使用VScode连接服务器。

step1: 安装 Remote - ssh 扩展 step2&#xff1a; 进入步骤2中&#xff0c;进行文件配置。 step3&#xff1a; 点击箭头进行连接。 step4&#xff1a; 输入密码即可。选择 platform时候&#xff0c;选择使用 Linux&#xff0c;而不是windows。

FreeRTOS创建第一个程序

使用freeRTOS创建任务时使用如下函数 函数的参数 创建一个FreeRTOS任务点亮led灯实现led灯500毫秒翻转一次 具体的代码实现 #include "stm32f10x.h" // Device header #include "Delay.h" #include "freeRTOS.h" #include &quo…

PMP持证者在面试项目经理时有加持吗?

对PMP认证获取后是否在面试中加持很多人是没有体验过的&#xff0c;因为大部分人考取PMP认证的原因是因为公司的要求&#xff0c;没有这个证书可能面临被“优化”的风险。理论上来说一样的道理&#xff0c;PMP认证既然能够保住工作岗位&#xff0c;那么在面试中一定会有相应的作…

利用AI开源引擎平台:构建文本、图片及视频内容审核系统|可本地部署

网络空间的信息量呈现出爆炸式增长。在这个信息多元化的时代&#xff0c;内容审核系统成为了维护网络秩序、保护用户免受有害信息侵害的重要工具。本文将探讨内容审核系统的核心优势、技术实现以及在不同场景下的应用。 开源项目介绍(可本地部署&#xff0c;支持国产化) 思通数…

【RK平台 dumpsys info使用】

RK平台 dumpsys info使用 问题描述解决方法郑重声明:本人原创博文,都是实战,均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Rockchip OS:Android 7.1.2 Kernel: 3.10 问题描述 在看问题的时候,经常需要查看内存情况,等各项指标 解决方法 1.常用的dumpsys …