所以这是交易,我搜索了每一个问题并在线链接,但没有一个是有帮助的。 我的启动画面有.jpg格式的120帧动画。我知道jpeg会在内存中转换为位图,这就是我得到OutOfMemoryError的原因。我获得动画的最大帧数是10.有没有办法逐帧完成,或者我应该尝试别的东西。这是我的代码:
final AnimationDrawable anim = new AnimationDrawable();
anim.setOneShot(true);
for (int i = 1; i <= 120; i++)
{
Drawable logo = getResources().getDrawable(getResources()
.getIdentifier("l"+i, "drawable", getPackageName()));
anim.addFrame(logo, 50);
if (i % 3 == 0)
{
System.gc();
}
}
ImageView myImageView = (ImageView) findViewById(R.id.SplashImageView);
myImageView.setBackgroundDrawable(anim);
myImageView.post(new Runnable()
{
public void run()
{
anim.start();
}
});
我已将120个jpegs放在drawable文件夹下,并带有“l”前缀(例如l1,l2等)。 我每3个jpeg做一次垃圾收集,但这不会做任何事情。
答案 0 :(得分:4)
您可以尝试在AnimationDrawable
使用Handler.postDelayed
的情况下执行此操作。像这样:
final ImageView image = (ImageView) findViewById(R.id.SplashImageView);
final Handler handler = new Handler();
final Runnable animation = new Runnable() {
private static final int MAX = 120;
private static final int DELAY = 50;
private int current = 0;
@Override
public void run() {
final Resources resources = getResources();
final int id = resources.getIdentifier("l" + current, "drawable", getPackageName());
final Drawable drawable = resources.getDrawable(id);
image.setBackgroundDrawable(drawable);
handler.postDelayed(this, DELAY);
current = (current + 1) % MAX;
}
};
handler.post(animation);
此解决方案需要较少的内存,因为它当时只保留一个可绘制内容。
您可以使用handler.removeCallbacks(animation);
取消动画。
如果您想制作一次性动画,可以有条件地致电handler.postDelayed
:
if (current != MAX - 1) {
handler.postDelayed(this, DELAY);
}
答案 1 :(得分:1)
需要调用̶.̶r̶e̶c̶y̶c̶l̶e̶(̶)̶对位图你请勿使用̶a̶n̶y̶m̶o̶r̶e̶.̶否则他们不会被垃圾收集̶p̶r̶o̶p̶e̶r̶l̶y̶.̶
另外在清单集中使用大堆为true。这为您提供了更多的呼吸空间。 &GT)
答案 2 :(得分:1)
我尝试了所有这些解决方案,每一个都变得更好:D我可以使用更多的帧和更多的分辨率,但仍然不满足经理:(我发现最好的解决方案是使用视频而不是帧,它的工作就像一个魅力甚至低内存设备我在xperia u上使用视频编解码器(H.264 mp4)测试了150帧,尺寸为480 * 854,内存为256mb