Android动画 补间动画

news2024/11/16 7:40:33

目录

1.什么是补间动画 

2.XML实现方式

3.代码实现方式 

4.展现形式


1.什么是补间动画 

补间动画:属于Android中View动画的一种,就是涵盖了 平移、缩放、旋转 和 透明度四种变化的动画。实现方式有两种:xml文件 和 java代码。

四种补间动画分别为RotateAnimationScaleAnimationTranslateAnimationAlphaAnimation,他们的父类为Animation。

2.XML实现方式

首先res下 创建 anim 文件夹,并创建 xxx.xml 文件

代码如下,我们可以在xml里面直接设置动画类型及其属性,下面是一个透明度从0.2到1的动画

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:fromAlpha="0.2"
    android:toAlpha="1.0">
</alpha>

看下面的代码,看到set标签里面有四种动画,代表着四种动画可以组合放在一起执行,例如从左侧划出的时候,透明度从0到1。

特别注意,当我们对set标签使用Animation的属性时会对该标签下的所有子控件都产生影响。

<set xmlns:android="http://schemas.android.com/apk/res/android"
//组合动画独特的属性,表示动画是否和集合共享一个插值器
//如果集合不指定插值器,那么自动化需要单独设置
android:shareInterpolator="true" >
<!--透明度-->
<alpha
    android:fromAlpha="透明度起始值,0表示完全透明"
    android:toAlpha="透明度最终值,1表示不透明"
    android:duration="动画持续时间 比如1000毫秒"
    android:fillAfter="true表示保持动画结束时的状态,false表示不保持"/>
<!--缩放-->
<scale
    android:fromXScale="水平方向缩放的起始值,比如0"
    android:fromYScale="竖直方向缩放的起始值,比如0"
    android:toXScale="水平方向缩放的结束值,比如2"
    android:toYScale="竖直方向缩放的结束值,比如2"
    android:pivotX="缩放支点的x坐标"
    android:pivotY="缩放支点的y坐标(支点可以理解为缩放的中心点,缩放过程中这点的坐标是不变的;支点默认在中心位置)" />
<!--位移-->
<translate
    android:fromXDelta="x起始值"
    android:toXDelta="x结束值"
    android:fromYDelta="y起始值"
    android:toYDelta="y结束值" />
<!--旋转-->
<rotate
    android:fromDegrees="旋转起始角度"
    android:toDegrees="旋转结束角度"
    android:pivotX="缩放支点的x坐标"
    android:pivotY="缩放支点的y坐标" />
</set>

在xml中配置好后就可以直接在代码中进行引用。引用方式如下:

//使用系统库自带的AnimationUtils,生成一个动画,第一个参数是上下文,第二个参数是你的xml文件
val animation = AnimationUtils.loadAnimation(this, R.anim.fade_in_10)
//开始动画
alphaImg?.startAnimation(animation)

整理了一下相关的xml属性及其对应的java方法  

  1. android:detachWallpaper    setDetachWallpaper(boolean)    是否在壁纸上运行
  2. android:duration    setDuration(long)    动画持续时间,毫秒为单位
  3. android:fillAfter    setFillAfter(boolean)    控件动画结束时是否保持动画最后的状态
  4. android:fillBefore    setFillBefore(boolean)    控件动画结束时是否还原到开始动画前的状态
  5. android:fillEnabled    setFillEnabled(boolean)    与android:fillBefore效果相同
  6. android:interpolator    setInterpolator(Interpolator)    设定插值器(指定的动画效果,譬如回弹等)
  7. android:repeatCount    setRepeatCount(int)    重复次数
  8. android:repeatMode    setRepeatMode(int)    重复类型有两个值,reverse表示倒序回放,restart表示从头播放
  9. android:startOffset    setStartOffset(long)    调用start函数之后等待开始运行的时间,单位为毫秒
  10. android:zAdjustment    setZAdjustment(int)    表示被设置动画的内容运行时在Z轴上的位置(top/bottom/normal),默认为normal
     

3.代码实现方式 

四种补间动画分别为RotateAnimationScaleAnimationTranslateAnimationAlphaAnimation,他们的父类为Animation。传入想要的参数生成对应动画,再根据需求配置属性

直接上代码:下面实现的是,一张普通图片,根据四个按钮,图片执行不同的动画

 //代码实现补间动画,相关的动画里的构造参数可以点到源码去查看
        val animationCodeAlpha = AlphaAnimation(0f, 1f)//参数:起始透明度,最终透明度
        animationCodeAlpha.duration = 3000 //动画执行世间
        animationCodeAlpha.fillAfter = false //是否保存最后状态,为true就会保存,false执行完后会恢复原样
        animationCodeAlpha.repeatCount = 2 //执行次数,-1  为无数次

        val animationCodeRotate = RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f)
        animationCodeRotate.duration = 3000
        animationCodeRotate.fillAfter = false

        val animationCodeTranslate = TranslateAnimation(-200f, 0F, 0f, -100f)
        animationCodeTranslate.duration = 3000
        animationCodeTranslate.fillAfter = false

        val animationCodeScale = ScaleAnimation(0f, 1f, 0f, 1f)
        animationCodeScale.duration = 3000
        animationCodeScale.fillAfter = false

        alphaTV?.setOnClickListener {
            animationCodeImg?.animation = animationCodeAlpha
            animationCodeAlpha.start()
        }
        rotateTV?.setOnClickListener {
            animationCodeImg?.animation = animationCodeRotate
            animationCodeRotate.start()
        }
        translateTv?.setOnClickListener {
            animationCodeImg?.animation = animationCodeTranslate
            animationCodeTranslate.start()
        }
        scaleTV?.setOnClickListener {
            animationCodeImg?.animation = animationCodeScale
            animationCodeScale.start()
        }

上面就是一个标准的使用我们定义的补间动画的模板。至于补间动画的使用,Animation还有如下一些比较实用的方法介绍:

Animation类的方法   

  • reset()    重置Animation的初始化
  • cancel()    取消Animation动画
  • start()    开始Animation动画
  • setAnimationListener(AnimationListener listener)    给当前Animation设置动画监听
  • hasStarted()    判断当前Animation是否开始
  • hasEnded()    判断当前Animation是否结束

既然补间动画只能给View使用,那就来看看View中和动画相关的几个常用方法吧,如下:

View类的常用动画操作方法    解释

  • startAnimation(Animation animation)    对当前View开始设置的Animation动画
  • clearAnimation()    取消当View在执行的Animation动画

tips:补间动画执行之后并未改变View的真实布局属性值。切记这一点,譬如我们在Activity中有一个Image在屏幕上方,我们设置了平移动画移动到屏幕下方然后保持动画最后执行状态呆在屏幕下方,这时如果点击屏幕下方动画执行之后的Image是没有任何反应的,而点击原来屏幕上方没有Image的地方却响应的是点击Image的事件。

补充:差值器

//设置动画为加速动画(动画播放中越来越快)  
android:interpolator="@android:anim/accelerate_interpolator" 
//设置动画为减速动画(动画播放中越来越慢)  
android:interpolator="@android:anim/decelerate_interpolator" 
//设置动画为先加速在减速(开始速度最快 逐渐减慢)
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
//先反向执行一段,然后再加速反向回来(相当于我们弹簧,先反向压缩一小段,然后在加速弹出)  
android:interpolator="@android:anim/anticipate_interpolator"
//同上先反向一段,然后加速反向回来,执行完毕自带回弹效果(更形象的弹簧效果)  
android:interpolator="@android:anim/anticipate_overshoot_interpolator" 
//执行完毕之后会回弹跳跃几段(相当于我们高空掉下一颗皮球,到地面是会跳动几下)
android:interpolator="@android:anim/bounce_interpolator"   
//循环,动画循环一定次数,值的改变为一正弦函数:Math.sin(2* mCycles* Math.PI* input)  
android:interpolator="@android:anim/cycle_interpolator" 
//线性均匀改变
android:interpolator="@android:anim/linear_interpolator"   
//加速执行,结束之后回弹 
android:interpolator="@android:anim/overshoot_interpolator"

代码里:默认匀速哦 

animation.setInterpolator(new AccelerateInterpolator());  

animation.setInterpolator(new DecelerateInterpolator());  

animation.setInterpolator(new AccelerateDecelerateInterpolator());  

animation.setInterpolator(new AnticipateInterpolator());  

animation.setInterpolator(new AnticipateOvershootInterpolator());  

animation.setInterpolator(new BounceInterpolator());  

animation.setInterpolator(new CycleInterpolator(2));  

animation.setInterpolator(new LinearInterpolator());  

animation.setInterpolator(new OvershootInterpolator());  

4.展现形式

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

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

相关文章

[附源码]计算机毕业设计大学生志愿者服务管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

擎创技术流 | ClickHouse实用工具—ckman教程(6)

哈喽~小伙伴们&#xff0c;今天依旧是每一周一期的技术分享~ 关于“ckman”的技术分享已经第6期了&#xff0c;大家是不是跟小编一样收获颇丰&#xff1f;新知识虽然新鲜有趣&#xff0c;但也别忘了回顾旧知识巩固基础噢~↓↓↓ 擎创技术流 | ClickHouse实用工具—ckman教程&…

10万字208道Java经典面试题总结(附答案)

前言 最近有很多粉丝问我&#xff0c;有什么方法能够快速提升自己&#xff0c;通过阿里、腾讯、字节跳动、京东等互联网大厂的面试&#xff0c;我觉得短时间提升自己最快的手段就是背面试题&#xff0c;最近总结了Java常用的面试题&#xff0c;分享给大家&#xff0c;希望大家都…

[附源码]Python计算机毕业设计SSM基于微信平台的车险投保系统设计与实现(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

VINS、MAVROS等的坐标系统一(草稿,未得出明确结果)

由于不同算法之间的坐标系不同&#xff0c;导致计算的结果混乱&#xff0c;该博客的目的是记录和统一不同算法之间的坐标系&#xff0c;保证坐标系的统一 一、VINS算法 vins算法&#xff0c;使用D435I相机。该坐标方向为&#xff1a;右前上分别为xyz。角度&#xff1a;由于是四…

SpringBoot+Vue实现前后端分离的心理咨询系统

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

代码随想录刷题记录 day38 最后一块石头的重量+目标和+1和0

代码随想录刷题记录 day38 最后一块石头的重量目标和1和0 参考&#xff1a;代码随想录 1049. 最后一块石头的重量 II 思想 把数组的石头尽可能地分成大小相等地两个集合 即sum/2&#xff1b; 容量为sum/2地背包尽可能地装满石头。 代码 class Solution {public int last…

C/C++入门002-C语言组成

文章目录1. C工程创建1.1 基于Code::Blocks创建工程1.2 Code::Blocks界面设置2. C语言程序组成2.1函数2.1.1 主函数2.1.2 其它函数2.1.3 如何执行定义好的函数2.2 输出函数printf2.2.1 编译输出为exe可执行文件2.3 C语言要求2.3.1 注释2.4 C语言程序练习2.4.1 输出三角形代码1&…

【MySQL基础】数据库定义语言DDL相关操作有那些?

目录 一、什么是DDL? 二、对数据库的常用操作 三、对表结构的常见操作 四、修改表结构格式 &#x1f49f; 创作不易&#xff0c;不妨点赞&#x1f49a;评论❤️收藏&#x1f499;一下 一、什么是DDL? DDL(Data Definition Language) 被称为数据库定义语言&#xff0c;该…

如何基于企业微信通讯录,同步生成对外的LDAP服务?

不少企业使用企业微信作为办公协同的工具&#xff0c;并通过企业微信的组织架构&#xff08;即通讯录&#xff09;来管理员工身份。那么如何利用当前企业微信的组织架构和用户身份&#xff0c;同步生成对外的 LDAP 服务呢&#xff1f; 为什么要同步创建 LDAP 服务&#xff1f; …

【超级详细步骤】pyinstaller 打包 exe 其实特别简单

文章目录为什么要打包&#xff1f;安装pyinstaller技术提升pyinstaller 打包单个.py文件步骤1&#xff1a;单击以下区域输入 cmd 切换到目标文件目录2&#xff1a;输入 pyinstaller -F -w Analog_clock.py 回车即可3&#xff1a;打包成功会在.py文件同级目录下出现以下文件&…

VM——http协议及json解析

1、http协议实现参考&#xff1a;(180条消息) C# Http通讯协议的整理_C#Code- Sheep的博客-CSDN博客_c# http协议 2、Json解析参考&#xff1a;c#解析json字符串处理&#xff08;最清晰易懂的方法&#xff09; - 轩辕箭 - 博客园 (cnblogs.com) 3、VM中http实现步骤&#xff…

WordPress 主题模板QUX9.1.4开心版无授权限制 DUX二开增强主题

源码测评&#xff1a;WordPress主题QUX9.1.4开心版&#xff0c;我安装测试了下&#xff0c;看来没什么问题&#xff0c;想学习参考的网友可以试下。 更新日志&#xff1a; 2020/3/19更新 V9.1.4 推荐&#xff1a;★★★★★ 新增 新增夜间模式&#xff08;主题设置 – 客服 –…

基于Python+Django+Vue+MYSQL的社团管理系统

项目介绍 随着近年来大学教育的改革&#xff0c;大部分高校普遍开始实行学分制、弹性学制改革&#xff0c;这样学校在学生的学习和生活中所起的作用慢慢减小&#xff0c;不再是一种直接由学校决定学生的大学生活。学生对自己的学习和生活有了更大的自主权&#xff0c;在课余也…

虹科分享 | 盘点世界杯有趣小知识!带你感受体育赛事可视化的快乐!

卡塔尔世界杯 2022年卡塔尔世界杯是第二十二届世界杯足球赛&#xff0c;是历史上首次在卡塔尔和中东国家境内举行、也是第二次在亚洲举行的世界杯足球赛。 今年卡塔尔世界杯可谓精彩纷呈&#xff0c;花2000个亿在沙漠里打造出的空调球场、洗脑又魔性的“母鸡生蛋”主题曲《Tu…

【Linux】进程创建、退出和等待(fork、exit和_exit、waitpid和wait、阻塞和非阻塞)

文章目录1、进程创建1.1 理解fork函数1.2 fork函数的细节2、进程退出2.1 退出码2.2 exit函数和_exit系统调用3、进程等待3.1 wait和waitpid3.2 阻塞和非阻塞1、进程创建 进程的创建主要依靠系统接口fork函数。 fork函数从已存在的一个进程中&#xff0c;创建一个子进程&#…

刚接触测试如何编写测试用例?看看摸鱼5年的老点工是怎么写的

给你个需求&#xff0c;你要怎么转变成最终的用例&#xff1f; 直接把需求文档翻译一下就完事了。 老点工拿到需求后的标准操作&#xff1a; 第一步&#xff1a;解析需求 先解析需求-找出所有需求中的动词&#xff0c;再列出所有测试点。测试点过程不断发散&#xff0c;对于…

第十四章: ReentrantLock、ReentrantReadWriteLock、StampedLock

相关面试题锁的演变ReentrantReadWriteLock锁降级案例演示一案例演示二总结为什么要有锁降级邮戳锁 StampedLock邮戳锁的特点案例演示一案例演示二StampedLock 缺点相关面试题 你说你用过读写锁&#xff0c;锁饥饿问题是什么&#xff1f;有没有比读写锁更快的锁&#xff1f;St…

域名解析函数 gethostbyname

在实现TCP/UDP编程的时候&#xff0c;服务端绑定的IP地址是点分十进制的&#xff0c;如124.222.215.205&#xff0c;如果提供的是域名&#xff0c;此时我们需要将域名转换成点分十进制的IP地址&#xff0c;这个过程就是 “ 域名解析 ”&#xff0c;实现域名转换的函数就是 geth…

Python Aws Ubuntu20 配置多IP

1. 业务场景&#xff1a; 高频次交易需要多次访问接口&#xff0c;配置单服务器多IP绕过币安单个IP频率限制 2. AWS实例选择&#xff1a; t3系列&#xff0c;东京A区&#xff0c;ubuntu20 这是我测试的币安延迟最低的配置&#xff08;平均6ms&#xff09; 换一个区域、一个系…