AnimationDrawable OOM

当用帧动画来加载多张图片时 常用
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>R.drawable.xxx</item>
.
.
.
</animation-list>
当设备配置比较低时常常会发生OOM异常,这是因为加载帧动画时将所有的图片加载到内存中所以会发生OOM,如何去解决这个问题:如下`public class SceneAnimation {
private ImageView mImageView;
private int[] mFrameRess;
private int[] mDurations;
private int mDuration;

private int mLastFrameNo;
private long mBreakDelay;

public SceneAnimation(ImageView pImageView, int[] pFrameRess,
int[] pDurations) {
mImageView = pImageView;
mFrameRess = pFrameRess;
mDurations = pDurations;
mLastFrameNo = pFrameRess.length - 1;

mImageView.setBackgroundResource(mFrameRess[0]);
play(1);
}

public SceneAnimation(ImageView pImageView, int[] pFrameRess, int pDuration) {
mImageView = pImageView;
mFrameRess = pFrameRess;
mDuration = pDuration;
mLastFrameNo = pFrameRess.length - 1;

mImageView.setBackgroundResource(mFrameRess[0]);
playConstant(1);
}

public SceneAnimation(ImageView pImageView, int[] pFrameRess,
int pDuration, long pBreakDelay) {
mImageView = pImageView;
mFrameRess = pFrameRess;
mDuration = pDuration;
mLastFrameNo = pFrameRess.length - 1;
mBreakDelay = pBreakDelay;

mImageView.setBackgroundResource(mFrameRess[0]);
playConstant(1);
}

private void play(final int pFrameNo) {
mImageView.postDelayed(new Runnable() {
public void run() {
mImageView.setBackgroundResource(mFrameRess[pFrameNo]);
if (pFrameNo == mLastFrameNo)
play(0);
else
play(pFrameNo + 1);
}
}, mDurations[pFrameNo]);
}

private void playConstant(final int pFrameNo) {
mImageView.postDelayed(new Runnable() {
public void run() {
mImageView.setBackgroundResource(mFrameRess[pFrameNo]);

if (pFrameNo == mLastFrameNo)
 playConstant(0);
else
 playConstant(pFrameNo + 1);

}
}, pFrameNo == mLastFrameNo && mBreakDelay > 0 ? mBreakDelay
: mDuration);
}
};

`
这是网上常用的一种方式,利用postDelayed 控制每帧的显示时间,所有图片一个一个的set到imageview中,这样可以一张一张顺序的加载,不需要全部加载到内存, 大大降低内存消耗,其实还是希望能够在animationDrawable 中进行分布加载,如果有大牛对animationDrawable修改后可以防止oom的,可以指导指导。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AnimationDrawable是一个用于实现帧动画的类。它允许您将多张图片以特定的顺序显示在屏幕上,从而创建连续的动画效果。 要使用AnimationDrawable,首先需要在XML或Java代码中定义一个AnimationDrawable对象,并将每一帧图片添加到其中。然后,您可以通过调用start()方法启动动画,或者通过调用stop()方法停止动画。 以下是一个使用AnimationDrawable创建帧动画的示例: 1. 在XML文件中定义AnimationDrawable对象和每一帧图片: ```xml <animation-list android:id="@+id/animation" android:oneshot="false"> <item android:drawable="@drawable/frame1" android:duration="100"/> <item android:drawable="@drawable/frame2" android:duration="100"/> <item android:drawable="@drawable/frame3" android:duration="100"/> <!-- 添加更多的帧图片 --> </animation-list> ``` 2. 在Java代码中获取AnimationDrawable对象,并将其应用到ImageView上: ```java ImageView imageView = findViewById(R.id.imageView); AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getDrawable(); ``` 3. 启动动画: ```java animationDrawable.start(); ``` 这样,您就可以在ImageView上显示帧动画了。每一帧图片将按照指定的持续时间进行切换,从而呈现出动画效果。 请注意,AnimationDrawable可以通过调用stop()方法停止动画。此外,您还可以设置动画是否循环播放,通过将android:oneshot属性设置为true或false来实现。 希望这个例子能够帮助您理解如何使用AnimationDrawable创建帧动画!如果有任何问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值