andoid逐帧动画oom_Android 逐帧动画( Drawable 动画),这一篇就够了

前言

作为 Android 最常见的两种动画形式,逐帧动画( Drawable 动画),有着极其广泛的应用,它的原理与早起的电影以及 GIF 类似,就是把一张的图,按顺序快速切换,这样一来看上去就好像会动一样。

实例,大家先看看效果

大家明显可以看到这是一个动图,但是它并非一个 GIF 它是由八张单独的图片,间隔 200ms 连续播放所实现的效果。

实现方法

这里我给大家介绍两种实现方法

在活动代码中添加实现

先生成 animation-list 的资源文件,再在活动中引用。

在代码中添加

在代码中添加顾名思义,就是将要播放的图片集合,一张一张的添加到一个 AnimationDrawable 对象中去,接着再将其添加到 imageView 中,调用 start() 方法便能开始播放。

注意:这里有个 OneShot() 方法,该方法用于设置是否需要循环播放,true为仅播放一次,false 为连续的循环播放。

imageView_2 =findViewById(R.id.image_2);

AnimationDrawable animationDrawable1= newAnimationDrawable();

animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_1 ),200);

animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_2 ),200);

animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_3 ),200);

animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_4 ),200);

animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_5 ),200);

animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_6 ),200);

animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_7 ),200);

animationDrawable1.addFrame(getResources().getDrawable(R.drawable.iron_8 ),200);

animationDrawable1.setOneShot(true);

imageView_2.setImageDrawable(animationDrawable1);

animationDrawable1.start();

引用资源文件方法

方法一有一个很严重的缺陷,就是每次要给控件添加这个动画时,都需要重新一步步的添加,但是有的时候,一套动画,我们可能需要在很多地方反复的使用到。

这时如果我们采用,将动画封装在一个资源文件中,在需要使用的时候能够像添加背景图一样简单的添加它:

步骤

在 /res/drawable 文件夹下建立一个名为 abunation_list.xml 的文件

在活动代码中,像添加图片资源一样的,为控件添加它

通过 getDrawable 方法,重空间中获得它并添加给 AnimationDrawable 对象

调用 start 方法开启动画

建立资源文件如下

将其添加到 ImageView 中

imageView_1 =findViewById(R.id.image_1);

imageView_1.setImageResource(R.drawable.abunation_list);

AnimationDrawable animationDrawable=(AnimationDrawable) imageView_1.getDrawable();

animationDrawable.start();

注意事项

在使用帧动画时,这里有几个要点需要大家记住:

其一、在我的范例代码中,大家可以看到,是直接在 imageView 对象执行过 findViewById 后就添加了的,但是这样会导致一个严重的问题,对于一些手机而言,如果 onCreate 方法没有执行完,imageView 对象就不会真正的实例化出来,这就到导致空指针异常(NullPointException)。正确的使用方法,根据活动的运行周期,我们应该在 onResume 方法中添加它,这样就保证了所有的控件都被实例化出来,

其二、对与帧动画,我们不建议添加太大的图片,因为这很容易导致 OOM,建议大家用 Drawable 动画,去做一些类似,加载动画,WiFi 链接动画这样,占有内存比较小的操作。

项目 Demo :

由于以上都是我自己的理解,如果有误,欢迎大家在评论区留言,谢谢 🙏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值