我想多次执行
canvas.drawBitmap(...)
,但现在一旦我在我的 SurfaceView 类中使用自定义 GestureDetector 调用 onScroll(...)
,应用程序就会冻结 (ANR)。这个 SurfaceView 流程由 GameThread 控制,我在其中绘制了 3 次canvas.drawBitmap(...)
。值得注意的是,当我从 canvas.drawBitmap(...)
注释掉第二个或第三个 drawTmxMaps(...)
时,应用程序几乎可以正确滚动 - 几乎是因为它可以工作,但滚动很慢。
那么如何解决我的问题?
这是我的代码。
Loader.java
private static Map<Integer, Bitmap[]> differentFramesMap = new HashMap<>();
private static Map<Integer, Canvas[]> differentCanvasesMap = new HashMap<>();
(...)
public static void drawTmxMaps(Canvas canvas, Context context) {
canvas.drawBitmap(differentFramesMap.get(0)[framesFirstAnimIter], 0, 0, PaintTemplates.getInstance(context).pMap);
canvas.drawBitmap(differentFramesMap.get(1)[framesSecondAnimIter], 0, 0, PaintTemplates.getInstance(context).pMap);
canvas.drawBitmap(differentFramesMap.get(2)[framesThirdAnimIter], 0, 0, PaintTemplates.getInstance(context).pMap);
if (!isIterStarted) {
iterTmxFrames();
isIterStarted = true;
}
}
private static void iterTmxFrames() {
runnable = () -> {
framesFirstAnimIter++;
framesSecondAnimIter++;
framesThirdAnimIter++;
if (framesFirstAnimIter == 3)
framesFirstAnimIter = 0;
if (framesSecondAnimIter == 2)
framesSecondAnimIter = 0;
if (framesThirdAnimIter == 2)
framesThirdAnimIter = 0;
handler.postDelayed(runnable, 1000);
};
handler.postDelayed(runnable, 1000);
}
MyThread.java
@Override
public void run() {
while (isRunning) {
startTime = SystemClock.uptimeMillis();
Canvas canvas = surfaceHolder.lockCanvas(null);
if (canvas != null) {
synchronized (surfaceHolder) {
TmxLoader.drawTmxMaps(canvas, gameSurface.getContext());
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
loopTime = SystemClock.uptimeMillis() - startTime;
if (loopTime < delay) {
try {
Thread.sleep(delay - loopTime);
} catch (InterruptedException e) {
Log.e("Interupted ex", e.getMessage());
}
}
}
}