我有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();
}
}
};
像那样在运行时加载位图将会非常缓慢。
我所做的是在游戏创建时加载所有的位图,并将它们存储在一个数组中。然后当你绘图时,你只需要引用位图数组并获得当前帧的正确图像。它使用更多内存,但这总是为了更快的运行时间而付出的代价。