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

安卓坦克游戏TextView炮弹动画延迟移除问题及解决方案

搞定Android坦克游戏的炮弹动画同步问题

嘿,我看你已经找到了解决方向,不过还是来梳理下整个问题的来龙去脉,帮你把逻辑理得更清楚些~

你的问题场景

你在开发坦克游戏时,想用TextView模拟炮弹飞行的动画:每次在指定位置显示炮弹,1秒后移除,循环这个过程实现炮弹逐步推进的效果。但最初用CountDownTimer或者Thread.sleep()时,程序会卡顿,而且所有炮弹TextView要等到for循环跑完才一起消失,完全达不到逐帧动画的预期。

原代码为啥不行?

你原来的for循环里,一次性把所有创建TextView、添加到布局、启动倒计时移除的操作都丢进了主线程的消息队列。Android的UI更新是按队列顺序执行的,这就导致所有TextView先一股脑儿都显示出来,等所有倒计时都结束后,又一起被移除,自然看不到逐帧移动的效果。要是用Thread.sleep()更糟,直接阻塞主线程,界面卡到动不了。

正确的打开方式:用Handler逐帧控制UI

你最后用的预存位置+Handler+Runnable的思路完全正确!先把炮弹飞行路径上的所有位置对应的TextView都预先创建好并存进集合,然后通过Handler.postDelayed()来逐帧执行添加、显示、检查碰撞的逻辑,这样就能保证每一帧的操作按顺序执行,不会出现批量操作的混乱。

你的最终解决代码(加了点注释)

public void drawShot(final Button firework, final ArrayList<TextView> toDraw){ 
    // 用数组保存当前帧索引,因为Runnable里无法修改普通局部变量
    final int[] i = {0}; 
    final Handler mHandler = new Handler(); 
    
    firework.setOnClickListener(new View.OnClickListener() { 
        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) 
        @Override 
        public void onClick(View v) { 
            firework(firework,toDraw.get(i[0]).getX(),toDraw.get(i[0]).getY()); 
        } 
    }); 
    
    // 定义逐帧执行的任务
    Runnable runnable = new Runnable() { 
        @Override 
        public void run() { 
            // 添加当前帧的炮弹到布局
            layout.addView(toDraw.get(i[0])); 
            // 检查是否击中目标,没击中就继续下一帧
            if(!check(toDraw.get(i[0]))) { 
                // 延迟指定时间后执行下一次绘制,这里的1ms可以改成你想要的帧间隔,比如1000ms就是每秒一帧
                mHandler.postDelayed(this, 1); 
            } 
            // 切换到下一帧
            i[0]++; 
        } 
    }; 
    // 启动动画流程
    mHandler.post(runnable); 
}

额外优化小建议

  • 比起TextView,用ImageView来显示炮弹会更灵活,能替换成真实的炮弹图片;
  • 可以复用单个TextView/ImageView,不用创建一堆对象——每次只更新它的X/Y坐标,这样能减少内存占用;
  • 如果需要让每个炮弹显示1秒再消失,再启动下一帧,可以在添加后加一个延迟移除的任务,比如:
    layout.addView(toDraw.get(i[0]));
    mHandler.postDelayed(() -> layout.removeView(toDraw.get(i[0])), 1000);
    

内容的提问来源于stack exchange,提问作者DoFlamingo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:14:11