3

所以这是交易,我已经在线搜索了每一个问题和链接,但没有任何帮助。我的初始屏幕有 120 帧 .jpg 格式的动画。我知道 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 个 jpeg 放在带有“l”前缀的可绘制文件夹下(例如 l1、l2 等)。我每 3 个 jpeg 进行一次垃圾收集,但这无济于事。

4

3 回答 3

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);
}
于 2013-01-15T15:22:51.733 回答
1

Y̶o̶u̶ ̶n̶e̶e̶d̶ ̶t̶o̶ ̶c̶a̶l̶l̶ ̶.̶r̶e̶c̶y̶c̶l̶e̶(̶)̶ ̶o̶n̶ ̶t̶h̶e̶ ̶b̶i̶t̶m̶a̶p̶s̶ ̶y̶o̶u̶ ̶d̶o̶n̶'̶t̶ ̶u̶s̶e̶ ̶a̶n̶y̶m̶o̶r̶e̶.̶ ̶O̶t̶h̶e̶r̶w̶i̶s̶e̶ ̶t̶h̶e̶y̶ ̶w̶o̶n̶t̶ ̶b̶e̶ ̶g̶a̶r̶b̶a̶g̶e̶ ̶c̶o̶l̶l̶e̶c̶t̶e̶d̶ ̶p̶r̶o̶p̶e̶r̶l̶y̶.̶

同样在清单集中使用大堆为真。这给了你更多的呼吸空间。>)

于 2013-01-15T15:05:54.900 回答
1

我尝试了所有这些解决方案,每个解决方案都变得更好:D 我可以使用更多帧和更高分辨率,但仍然不能让经理满意:(我发现最好的解决方案是使用视频而不是帧它对于即使是低内存设备也很有魅力我在 xperia u 上使用 256mb 内存的视频编解码器 (H.264 mp4) 测试了 150 帧,每个尺寸为 480*854

于 2013-03-17T08:19:16.817 回答