使用Android上的框架创建动画启动画面

时间:2013-01-15 14:56:11

标签: android animation frame out-of-memory splash-screen

所以这是交易,我搜索了每一个问题并在线链接,但没有一个是有帮助的。 我的启动画面有.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做一次垃圾收集,但这不会做任何事情。

3 个答案:

答案 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