我有17个相同大小的位图,它们是角色动画的帧,我希望它们在我的代码中循环。我希望能够使用inBitmap,因为我正在重用相同的位图。关于这样做,我有几个问题:
我可以/我应该缓存位图,如果是,如何?
还有更高效的内存方式吗?
我的代码如下所示:(我正在使用自定义绘制视图)
的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();
}
}
};
答案 0 :(得分:0)
在运行时加载位图会最终变得非常慢。
我所做的是在创建游戏时加载我的所有位图,并将它们存储在一个数组中。然后在绘图时,只需引用位图数组并获取当前帧的正确图像。它使用更多的内存,但总是需要权衡更快的运行时间。