Android动画之帧动画

简介: 在Android开发时,为了实现一些动态的炫酷的效果,我们常用到帧动画,View动画(补间动画)和属性动画,今天就来总结下我在使用帧动画的实现方式。

在Android开发时,为了实现一些动态的炫酷的效果,我们常用到帧动画,View动画(补间动画)和属性动画,今天就来总结下我在使用帧动画的实现方式。


1、什么是帧动画?


帧动画就是顺序播放一组预先定义好的图片,就类似于我们观看视频,就是一张一张的图片连续播放。当播放速度达到一定速度后,就会在视觉上看起来像视频播放一样。


“人眼舒适放松时可视帧数是每秒24帧,集中精神时不超过30帧,眨眼时睁开眼瞬间可以捕捉到的帧数是30帧以上,为了性能优化,一般稍大于30帧就差不多了,当然,现在的手机,一般为60帧,又些可以开到120帧,每秒刷新120次,在界面切换和浏览各种界面时会流畅很多,当然带来的就是消耗更多的资源。


2、实现大致步骤


在res/drawable目录下定义一个XML文件,根节点为系统提供的animation-list,然后放入定义更好的图片,对每一个图片设置属性;

使用AnimationDrawable类播放第一步定义好的Drawable中的图片,形成动画效果;

3、关键属性配置


在xml中,首先是根结点的 android:oneshot="true",这个属性是代表动画执行多少次,例如,在进入App的入场动画,可设置成只播放一次,例如一些场景星空动画,他要星星一直闪烁,就可以设置成false,他会一直播放。2.在每个item中,

<item
    android:drawable="@drawable/welcome_00000"
    android:duration="49" />

drawable代表设置的资源,duration代表展示的时间

4、优缺点

优点:是真的简单啊!


缺点:


- 系统会把每一帧图片读取到内存中


- 当图片很多且每张都很大的情况下,容易出现卡顿,甚至 OOM


5、优化点


帧动画其实在App中并不是很友好,因为大量的图片资源来的性能上的影响资源占用过大(例如在界面加载时加载资源过多,绘制压力变大),也会导致内存剧烈抖动,也会导致包体过大。那么可以从以下方式进行优化:


图片压缩和转码,一般UI给你的图片小则几十K,大则1,2M,这样肯定是不可取的,根本用不着这样大的图片,这时候就可以进行图片压缩和转码,网上很多压缩和转码的网页,可以把图片资源压缩转码后再拿到项目中引用。转码我推荐的是转成webp格式。(tips:1.webp是由谷歌推出的一种全新图片文件格式,与JPEG格式一样,Webp是一种有损压缩格式。2.webp文件格式和JPEG类似,也是通过牺牲图片质量来降低图片文件大小,但能在相同质量的情况下比JPEG文件尺寸小巧许多。目前的Chrome应用商店图片已全部转换为WebP格式。)压缩的话,这个网站很好用,TinyPNG – Compress WebP, PNG and JPEG images intelligently

延迟加载,在一些复杂的界面,在onCrete的时候,大量的VIew会进行绘制,如果你的App本来就性能堪忧,这时候再同时进行动画加载,那么是考虑使用Hanlder.postDelayed()方法延迟一两秒执行,这样会好很多,之前我们就出现过,界面卡顿的问题,延迟执行后好多了。

别把duration设的太低,小了就代表着刷新率贼高,让用户看着不卡顿就行了。

图片回收和复用:BitmapFactory 加载图片通过 Options 配置参数优化

inPreferredConfig 设置颜色模式,不带透明度的 RGB_565 内存只有默认的 ARGB_8888 的一半

inSampleSize 根据显示控件的大小对图像采样,返回较小的图像以节省内存

inMutable 设置解码得到的 bitmap 可变

inBitmap 复用前一帧图片,避免内存抖动

对于单次播放的帧动画,每一帧图片使用之后及时复用或者回收是合理的

使用SoftReference(软引用)如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足,就会回收这些对象的内存(系统自动帮你回收,不用操心多好)

6.代码实现


xml动画资源文件:anim_login_start_loading.xml


<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">
    <item
        android:drawable="@drawable/welcome_00000"
        android:duration="49" />
    <item
        android:drawable="@drawable/welcome_00001"
        android:duration="49" />
    <item
        android:drawable="@drawable/welcome_00002"
        android:duration="49" />
    <item
        android:drawable="@drawable/welcome_00003"
        android:duration="49" />
    <item
        android:drawable="@drawable/welcome_00004"
        android:duration="49" />
    <item
        android:drawable="@drawable/welcome_00005"
        android:duration="49" />
    <item
        android:drawable="@drawable/welcome_00006"
        android:duration="49" />
    <item
        android:drawable="@drawable/welcome_00007"
        android:duration="49" />
    <item
        android:drawable="@drawable/welcome_00008"
        android:duration="49" />
    <item
        android:drawable="@drawable/welcome_00009"
        android:duration="49" />
    <item
        android:drawable="@drawable/welcome_00010"
        android:duration="49" />
</animation-list>

代码进行实现:很简单,img是一个imageView,作为动画的容器,记得在src配置动画的第一张图片哦~,实现很简单,就是使用的AnimationDrawable实现的,当然也不一定是用ImageView作为容器哈。


img.setImageResource(ContextCompat.getDrawable(this,R.drawable.anim_login_start_loading))
        val anim = img.drawable as AnimationDrawable
        anim.start()

7、实现效果:

8cb2da3b21b43288209cbb2dc4e91bd.png

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