Android动画 补间动画

简介: 补间动画:属于Android中View动画的一种,就是涵盖了 平移、缩放、旋转 和 透明度四种变化的动画。实现方式有两种:xml文件 和 java代码。四种补间动画分别为RotateAnimation、ScaleAnimation、TranslateAnimation、AlphaAnimation,他们的父类为Animation。

1.什么是补间动画


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


四种补间动画分别为RotateAnimation、ScaleAnimation、TranslateAnimation、AlphaAnimation,他们的父类为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方法  
android:detachWallpaper    setDetachWallpaper(boolean)    是否在壁纸上运行
android:duration    setDuration(long)    动画持续时间,毫秒为单位
android:fillAfter    setFillAfter(boolean)    控件动画结束时是否保持动画最后的状态
android:fillBefore    setFillBefore(boolean)    控件动画结束时是否还原到开始动画前的状态
android:fillEnabled    setFillEnabled(boolean)    与android:fillBefore效果相同
android:interpolator    setInterpolator(Interpolator)    设定插值器(指定的动画效果,譬如回弹等)
android:repeatCount    setRepeatCount(int)    重复次数
android:repeatMode    setRepeatMode(int)    重复类型有两个值,reverse表示倒序回放,restart表示从头播放
android:startOffset    setStartOffset(long)    调用start函数之后等待开始运行的时间,单位为毫秒
android:zAdjustment    setZAdjustment(int)    表示被设置动画的内容运行时在Z轴上的位置(top/bottom/normal),默认为normal
3.代码实现方式 
四种补间动画分别为RotateAnimation、ScaleAnimation、TranslateAnimation、AlphaAnimation,他们的父类为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.展现形式

0298337dbd29b445abb38c2d40517b0.png

相关文章
|
3月前
|
存储 Shell Android开发
基于Android P,自定义Android开机动画的方法
本文详细介绍了基于Android P系统自定义开机动画的步骤,包括动画文件结构、脚本编写、ZIP打包方法以及如何将自定义动画集成到AOSP源码中。
78 2
基于Android P,自定义Android开机动画的方法
|
26天前
|
Android开发 UED
Android 中加载 Gif 动画
【10月更文挑战第20天】加载 Gif 动画是 Android 开发中的一项重要技能。通过使用第三方库或自定义实现,可以方便地在应用中展示生动的 Gif 动画。在实际应用中,需要根据具体情况进行合理选择和优化,以确保用户体验和性能的平衡。可以通过不断的实践和探索,进一步掌握在 Android 中加载 Gif 动画的技巧和方法,为开发高质量的 Android 应用提供支持。
|
6月前
|
Java Android开发 开发者
Android10 修改开发者选项中动画缩放默认值
Android10 修改开发者选项中动画缩放默认值
194 0
|
6月前
|
XML Java Android开发
android的三种动画
android的三种动画
38 0
|
4月前
|
XML Android开发 数据格式
Android 中如何设置activity的启动动画,让它像dialog一样从底部往上出来
在 Android 中实现 Activity 的对话框式过渡动画:从底部滑入与从顶部滑出。需定义两个 XML 动画文件 `activity_slide_in.xml` 和 `activity_slide_out.xml`,分别控制 Activity 的进入与退出动画。使用 `overridePendingTransition` 方法在启动 (`startActivity`) 或结束 (`finish`) Activity 时应用这些动画。为了使前 Activity 保持静止,可定义 `no_animation.xml` 并在启动新 Activity 时仅设置新 Activity 的进入动画。
106 12
|
4月前
|
XML Android开发 UED
Android动画之共享元素动画简单实践
本文介绍Android共享元素动画, 实现两Activity间平滑过渡特定UI元素。通过设置`transitionName`属性和使用`ActivityOptions.makeSceneTransitionAnimation`启动目标Activity实现动画效果。可自定义过渡动画提升体验。
66 0
|
5月前
|
Android开发 UED
Android Item平移动画
【6月更文挑战第18天】
109 8
|
4月前
|
Android开发
android 动画 插值器和估值器
android 动画 插值器和估值器
|
6月前
|
数据库 Android开发
Android数据库框架-GreenDao入门,2024年最新flutter 页面跳转动画
Android数据库框架-GreenDao入门,2024年最新flutter 页面跳转动画
Android数据库框架-GreenDao入门,2024年最新flutter 页面跳转动画
下一篇
无影云桌面