Android java:高效位图动画分配



我有17个相同大小的位图,它们是角色行走动画的帧,我希望它们在我的代码中循环。我希望能够使用inBitmap,因为我正在重用相同的位图。我对此有几个问题:

  1. 我可以/我应该缓存位图,如果是这样,如何?

  2. 是否有更有效的内存方法来做到这一点?

我的代码看起来像这样:(我使用自定义绘制视图)

onCreate:

        bitmapOptions.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(getResources(), R.drawable.walk0, bitmapOptions);
        aBitmap = Bitmap.createBitmap(bitmapOptions.outWidth,
                bitmapOptions.outHeight, Bitmap.Config.ARGB_8888);
        bitmapOptions.inJustDecodeBounds = false;
        bitmapOptions.inBitmap = aBitmap;
        bitmapOptions.inSampleSize = 1;
        BitmapFactory.decodeResource(getResources(), R.drawable.walk0, bitmapOptions);
        ship = Bitmap.createBitmap(aBitmap, 0, 0, aBitmap.getWidth(), aBitmap.getHeight(), shipMatrix, true);

onDraw:

@Override
protected void onDraw(Canvas canvas) 
{
shipRectf.right = ship.getWidth();
shipRectf.left = 0;
shipRectf.top = 0;
shipRectf.bottom = ship.getHeight();
canvas.drawBitmap(ship, null, shipRectf, null);
}

动画:

Runnable walkData = new Runnable()
    {
        public void run(){
            try{    
                BitmapFactory.Options shipOptions = null;
                shipOptions = bitmapOptions;
                if(shipOptions != null){
                shipOptions.inBitmap = aBitmap;
                }
            if(walkAnim==true)
                {
                    walkNum = (walkNum + 1) % imageIDs.length;
                   //walknum = index, imageids = int[] {R.drawables}
                    aBitmap = BitmapFactory.decodeResource(getResources(), imageIDs[walkNum], shipOptions);
                    ship = Bitmap.createBitmap(aBitmap, 0, 0, aBitmap.getWidth(), aBitmap.getHeight(), shipMatrix, true);
                                           invalidate();
                }
                if(walkAnim==false)
                {
                    walkNum = 0;
                    ship = BitmapFactory.decodeResource(getResources(), imageIDs[walkNum], shipOptions);
                }

            handler3.postDelayed(this, 50);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    };

像那样在运行时加载位图将会非常缓慢。

我所做的是在游戏创建时加载所有的位图,并将它们存储在一个数组中。然后当你绘图时,你只需要引用位图数组并获得当前帧的正确图像。它使用更多内存,但这总是为了更快的运行时间而付出的代价。

最新更新