我有一个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);
}
答案 0 :(得分:0)
我想你正在寻找Bitmap.prepareToDraw()
http://developer.android.com/reference/android/graphics/Bitmap.html#prepareToDraw()
答案 1 :(得分:0)
我不确定这是否有资格作为答案,但我最终解决的问题是糟糕的黑客攻击,我希望我能找到解决办法。我只是将其添加到OnDraw()
:
if (firstFrame) {
canvas.drawBitmap(mBitmapSlices[0], mSourceRect, mDestRect, null);
canvas.drawBitmap(mBitmapSlices[1], mSourceRect, mDestRect, null);
//etc...
firstTime = false;
}
所以,我在开始时画了一次,然后留在记忆中(即使我画了之后)。坦率地说,我认为这段代码令人作呕,但它是我能做的最好的。