Android - 在绘制到画布之前在内存中缓存位图

时间:2014-04-03 15:28:23

标签: android canvas bitmap

我有一个onDraw()每秒调用几次的视图。可以绘制七个位图,但一次只能绘制一个。

当显示位图时,它的位置每秒都会改变几次,因此它会不断重绘。发生这种情况时,没有明显的减速。但是,当图像发生变化时,在第一次绘制图像之前会有明显的减速。即使在构造函数中解码了位图,也会发生这种情况。

我认为这与缓存有关,而且图像没有正确加载到内存中。

我的问题:在canvas.drawBitmap()来电之前,我是否可以通过某种方式在内存中准备好图片?

我甚至不需要同时将所有7个加载到内存中:在任何给定时间,下一个图像只有2个可能的候选者。

public class MyView extends View {
  private Bitmap mBitmapSlices[] = new Bitmap[7];
  private Rect mSourceRect = new Rect();
  private Rect mDestRect = new Rect();

  private void init(Context context) {
    // initialize array of bitmap slices
    mBitmapSlices[0] = BitmapFactory.decodeResource(getResources(), R.drawable.bitmap1);
    mBitmapSlices[1] = BitmapFactory.decodeResource(getResources(), R.drawable.bitmap2);
    // etc.....
  }

  //stuff like constructors that call init and what-not

  @Override
  protected void onDraw(Canvas canvas) {
    // lots of logic

    if (condition) index = 0;  //simplified, there are actually 7 images
    else index = 1;

    Bitmap bmp = mBitmapSlices[index];

    //This is the issue  --- This call only takes longer the first frame when index changes
    canvas.drawBitmap(bmp, mSourceRect, mDestRect, null);

 }

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我不确定这是否有资格作为答案,但我最终解决的问题是糟糕的黑客攻击,我希望我能找到解决办法。我只是将其添加到OnDraw()

if (firstFrame) {
    canvas.drawBitmap(mBitmapSlices[0], mSourceRect, mDestRect, null);
    canvas.drawBitmap(mBitmapSlices[1], mSourceRect, mDestRect, null);
    //etc...

    firstTime = false;
}

所以,我在开始时画了一次,然后留在记忆中(即使我画了之后)。坦率地说,我认为这段代码令人作呕,但它是我能做的最好的。