所以这里的交易,我已经搜查每一个问题,并链接在线但没有一个是有帮助的。 我在.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();
}
});
我已经放置在JPEG文件120可绘制文件夹下有“L”字头(例如L1,L2等)。 我做垃圾回收,每3个JPEG文件,但不会做任何事情。
你可以尝试做没有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);
}
需要调用̶.̶r̶e̶c̶y̶c̶l̶e̶(̶)̶对位图你请勿使用̶a̶n̶y̶m̶o̶r̶e̶.̶否则他们不会被垃圾收集̶p̶r̶o̶p̶e̶r̶l̶y̶.̶
此外,在清单中设置使用大量堆为true。 这给你多一点呼吸的空间。 >)
我尝试了所有与每一个得到这些解决方案的更好:d我可以用更多的框架和更高的分辨率,但仍不能满足管理者:(我发现最好的解决方案是使用视频的帧而不是它的工作原理就像一个魅力甚至低内存设备我上XPERIA测试150帧,每帧大小480×854与视频编解码器(H.264 MP4)U的RAM 256MB