Android MediaPlayer onCompletion触发后canvas未自动重绘问题求解
问题根因
Android 自定义View默认只有主动调用invalidate()方法时才会触发onDraw()重绘界面。你现有的代码里只有玩家操作触发movePlayer()时才会调用invalidate()刷新,而createMaze()生成新迷宫后没有主动触发重绘,因此新迷宫要等玩家再次移动才会显示。
解决方案
在createMaze()方法的末尾新增重绘触发逻辑即可,修改后的createMaze()代码如下:
private void createMaze() { Stack<Cell> stack = new Stack<>(); Cell current, next; cells = new Cell[COLS][ROWS]; for (int x = 0; x < COLS; x++) { for (int y = 0; y < ROWS; y++) { cells[x][y] = new Cell(x, y); } } player = cells[0][0]; exit = cells[COLS - 1][ROWS - 1]; current = cells[0][0]; current.visited = true; do { next = getNeighbour(current); if (next != null) { removeWall(current, next); stack.push(current); current = next; current.visited = true; } else { current = stack.pop(); } } while (!stack.empty()); nextAction = "NOTHING"; playSound("START"); // 新增:主动触发View重绘,新迷宫会立即渲染到屏幕 invalidate(); }
补充说明
如果担心MediaPlayer的onCompletion()回调不在主线程导致invalidate()失效,可以把invalidate()替换为postInvalidate(),后者支持在任意线程调用,能安全触发重绘。
内容的提问来源于stack exchange,提问作者Clodoaldo Favaro
相关产品推荐
相关产品推荐

