Android java:高效的位图动画分配

时间:2014-06-15 23:26:22

标签: java android bitmap draw

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

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

  2. 还有更高效的内存方式吗?

  3. 我的代码如下所示:(我正在使用自定义绘制视图)

    的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();
            }
        }
        };
    

1 个答案:

答案 0 :(得分:0)

在运行时加载位图会最终变得非常慢。

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