Android Studio迷宫游戏实现随机移动Enemy时View无法更新问题求助
问题原因
你当前代码有两个核心错误导致敌人不动、View不更新:
- 每次
onDraw执行时都会强制把enemy重置回迷宫中心坐标,你在moveEnemy里修改的坐标会被直接覆盖,自然看不到移动效果 TimerTask运行在独立工作线程,一是Android不允许子线程直接触发UI更新,二是你修改完enemy坐标后没有主动触发View重绘,系统不会自动调用onDraw刷新界面
修复方案
1. 调整enemy初始化逻辑
把enemy的初始赋值从onDraw中移到View的构造方法里,避免每次绘制都重置位置:
// 在你的自定义View构造方法中添加这行,不要放在onDraw里 enemy = cells[(COLS - 1) / 2][(ROWS - 1) / 2]; @Override protected void onDraw (Canvas canvas){ // 删掉原来的enemy初始化代码,直接绘制即可 canvas.drawRect( enemy.col * cellSize + margin, enemy.row * cellSize + margin, (enemy.col + 1) * cellSize - margin, (enemy.row + 1) * cellSize - margin, enemyPaint); }
2. 子线程执行完移动逻辑后主动触发重绘
Android提供了postInvalidate()方法,可以在子线程直接调用触发View重绘,不需要手动切主线程,修改moveEnemy方法:
// 把Random抽成全局变量,不用每次移动都创建新实例 private Random random = new Random(); private void moveEnemy () { int randomDirection = random.nextInt(Direction.values().length); Direction direction = Direction.values()[randomDirection]; switch (direction) { case UP: if (!enemy.topWall) enemy = cells[enemy.col][enemy.row - 1]; break; case DOWN: if (!enemy.bottomWall) enemy = cells[enemy.col][enemy.row + 1]; break; case LEFT: if (!enemy.leftWall) enemy = cells[enemy.col - 1][enemy.row]; break; case RIGHT: if (!enemy.rightWall) enemy = cells[enemy.col + 1][enemy.row]; break; } // 新增这行触发View重绘 postInvalidate(); }
3. 补充内存泄漏防护(可选优化)
Timer和TimerTask如果在页面销毁时不主动停止,会持有View引用导致内存泄漏,你可以在View的onDetachedFromWindow方法中停止定时器:
@Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (timer != null) { timer.cancel(); timer = null; } if (updateEnemyTask != null) { updateEnemyTask.cancel(); updateEnemyTask = null; } }
内容的提问来源于stack exchange,提问作者tako
相关产品推荐
相关产品推荐

