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

相关文章
|
11月前
|
Android开发 开发者
Android利用SVG实现动画效果
本文介绍了如何在Android中利用SVG实现动画效果。首先通过定义`pathData`参数(如M、L、Z等)绘制一个简单的三角形SVG图形,然后借助`objectAnimator`实现动态的线条绘制动画。文章详细讲解了从配置`build.gradle`支持VectorDrawable,到创建动画文件、关联SVG与动画,最后在Activity中启动动画的完整流程。此外,还提供了SVG绘制原理及工具推荐,帮助开发者更好地理解和应用SVG动画技术。
545 30
|
11月前
|
Android开发 UED 计算机视觉
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
本文介绍了一款受游戏“金铲铲之战”启发的Android自定义View——线条等待动画的实现过程。通过将布局分为10份,利用`onSizeChanged`测量最小长度,并借助画笔绘制动态线条,实现渐变伸缩效果。动画逻辑通过四个变量控制线条的增长与回退,最终形成流畅的等待动画。代码中详细展示了画笔初始化、线条绘制及动画更新的核心步骤,并提供完整源码供参考。此动画适用于加载场景,提升用户体验。
680 5
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
|
11月前
|
API Android开发 开发者
Android颜色渐变动画效果的实现
本文介绍了在Android中实现颜色渐变动画效果的方法,重点讲解了插值器(TypeEvaluator)的使用与自定义。通过Android自带的颜色插值器ArgbEvaluator,可以轻松实现背景色的渐变动画。文章详细分析了ArgbEvaluator的核心代码,并演示了如何利用Color.colorToHSV和Color.HSVToColor方法自定义颜色插值器MyColorEvaluator。最后提供了完整的源码示例,包括ColorGradient视图类和MyColorEvaluator类,帮助开发者更好地理解和应用颜色渐变动画技术。
361 3
|
11月前
|
Android开发 开发者
Android SVG动画详细例子
本文详细讲解了在Android中利用SVG实现动画效果的方法,通过具体例子帮助开发者更好地理解和应用SVG动画。文章首先展示了动画的实现效果,接着回顾了之前的文章链接及常见问题(如属性名大小写错误)。核心内容包括:1) 使用阿里图库获取SVG图形;2) 借助工具将SVG转换为VectorDrawable;3) 为每个路径添加动画绑定属性;4) 创建动画文件并关联SVG;5) 在ImageView中引用动画文件;6) 在Activity中启动动画。文末还提供了完整的代码示例和源码下载链接,方便读者实践操作。
520 65
|
11月前
|
XML Java Maven
Android线条等待动画JMWorkProgress(可添加依赖直接使用)
这是一篇关于Android线条等待动画JMWorkProgress的教程文章,作者计蒙将其代码开源至GitHub,提升可读性。文章介绍了如何通过添加依赖库使用该动画,并详细讲解了XML与Java中的配置方法,包括改变线条颜色、宽度、添加文字等自定义属性。项目已支持直接依赖集成(`implementation &#39;com.github.Yufseven:JMWorkProgress:v1.0&#39;`),开发者可以快速上手实现炫酷的等待动画效果。文末附有GitHub项目地址,欢迎访问并点赞支持!
354 26
|
11月前
|
XML Android开发 数据格式
Android中SlidingDrawer利用透明动画提示效果
本文介绍了在Android中使用`SlidingDrawer`实现带有透明动画提示效果的方法。通过XML布局配置`SlidingDrawer`的把手(handle)和内容(content),结合Activity中的代码实现动态动画效果。最终实现了交互性强、视觉效果良好的滑动抽屉功能。
163 1
Android中SlidingDrawer利用透明动画提示效果
|
11月前
|
XML Java Android开发
Android 动画之帧动画 + 补间动画 + 属性动画
本文介绍了Android开发中的三种动画类型:帧动画、补间动画和属性动画。帧动画通过依次播放一系列静态图片实现动态效果,支持Java代码与XML两种实现方式。补间动画基于起始和结束位置自动生成过渡效果,涵盖透明度、位移、旋转、缩放及组合动画等多种形式,并可搭配插值器优化动画过程。属性动画则通过改变对象属性实现动画,支持透明度、位移、旋转、缩放及组合动画,灵活性更高且适用于更复杂的场景。文中提供了详细的代码示例,帮助开发者快速上手。
551 15
|
11月前
|
Android开发 开发者
Android自定义view之围棋动画(化繁为简)
本文介绍了Android自定义View的动画实现,通过两个案例拓展动态效果。第一个案例基于`drawArc`方法实现单次动画,借助布尔值控制动画流程。第二个案例以围棋动画为例,从简单的小球直线运动到双向变速运动,最终实现循环动画效果。代码结构清晰,逻辑简明,展示了如何化繁为简实现复杂动画,帮助读者拓展动态效果设计思路。文末提供完整源码,适合初学者和进阶开发者学习参考。
208 0
Android自定义view之围棋动画(化繁为简)
|
11月前
|
Java Android开发 开发者
Android自定义view之围棋动画
本文详细介绍了在Android中自定义View实现围棋动画的过程。从测量宽高、绘制棋盘背景,到创建固定棋子及动态棋子,最后通过属性动画实现棋子的移动效果。文章还讲解了如何通过自定义属性调整棋子和棋盘的颜色及动画时长,并优化视觉效果,如添加渐变色让白子更明显。最终效果既可作为围棋动画展示,也可用作加载等待动画。代码完整,适合进阶开发者学习参考。
257 0
|
11月前
|
XML Java API
Android翻转动画(卡片翻转效果)
本文介绍了如何实现卡片翻转动画效果,通过Android中的ObjectAnimator结合不同插值器(LinearInterpolator、AccelerateInterpolator、DecelerateInterpolator)完成平滑过渡。示例中以按钮点击触发动画,核心逻辑包括判断视图可见性、设置旋转角度及处理初始Bug(如第一次点击异常)。最终提供完整代码(Java与XML布局),并指出将按钮事件替换为屏幕监听即可满足右滑触发需求。适合初学者学习动画实现原理。
421 0

热门文章

最新文章