You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:45:04