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

Simon Says按钮点击后颜色无法恢复正常的技术问题咨询

解决Simon Says应用按钮点击后颜色无法恢复的问题

嘿,这个问题我之前做类似记忆游戏时也碰到过!看了你贴的代码,一眼就发现问题所在了:你只实现了按钮变成激活色的逻辑,完全没写恢复默认颜色的步骤,所以按钮亮起来之后就一直停在激活状态啦。

问题根源分析

你当前的代码里,Runnable只负责把ImageView切换到激活状态的图片,但执行完这个操作后就没有后续动作了,自然不会自动恢复到默认的按钮颜色。

修复方案

我们需要给按钮加一个“延迟恢复”的逻辑:先切换到激活色,等一小段时间(比如500毫秒,这个时长可以根据游戏节奏调整),再切换回默认颜色。用Handler.postDelayed()就能轻松实现这个延迟操作,而且代码更简洁。

修改后的完整代码如下:

public void flashButton(int color) {
    final ImageView colors = findViewById(R.id.buttonsImage);
    
    // 第一步:设置按钮为激活状态的颜色
    switch(color) {
        case 1:
            colors.setImageResource(R.drawable.green_activated_png);
            break;
        case 2:
            colors.setImageResource(R.drawable.yellow_activated_png);
            break;
        case 3:
            colors.setImageResource(R.drawable.red_activated_png);
            break;
        case 4:
            colors.setImageResource(R.drawable.blue_activated_png);
            break;
        default:
            // 非法颜色值直接返回,避免出错
            return;
    }

    // 第二步:延迟指定时间后,恢复按钮的默认颜色
    new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
        @Override
        public void run() {
            switch(color) {
                case 1:
                    colors.setImageResource(R.drawable.green_default_png); // 替换成你的绿色默认图片资源
                    break;
                case 2:
                    colors.setImageResource(R.drawable.yellow_default_png); // 替换成你的黄色默认图片资源
                    break;
                case 3:
                    colors.setImageResource(R.drawable.red_default_png); // 替换成你的红色默认图片资源
                    break;
                case 4:
                    colors.setImageResource(R.drawable.blue_default_png); // 替换成你的蓝色默认图片资源
                    break;
            }
        }
    }, 500); // 这里的500是延迟时长,单位为毫秒,可根据游戏体验调整
}

额外注意事项

  • 一定要把代码里的green_default_png等替换成你项目中实际存在的默认状态图片文件名,不然会报资源找不到的错误。
  • 如果你的flashButton方法是在非主线程调用的,Handler必须传入Looper.getMainLooper(),因为所有UI操作都必须在主线程执行,否则会抛出异常。
  • 建议把延迟时长定义成一个常量(比如private static final int FLASH_DURATION = 500;),这样后续调整游戏节奏时只需要改一个地方就行。

内容的提问来源于stack exchange,提问作者m.rights

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:48:47