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

如何实现按住按钮2秒填充progressBar、提前释放则重置隐藏的功能

问题原因

  • 你自定义的OnTouchListener返回了true消费了全部触摸事件,系统不会再自动更新按钮的isPressed状态,导致onTick里的判断永远不成立,进度自然不会更新
  • 没有全局持有CountDownTimer实例,每次按下都会新建计时器,且松开按钮时没有主动销毁正在运行的计时器,会出现逻辑冲突和内存泄漏
  • 未显式设置ProgressBar的最大值,部分机型默认ProgressBar的max值不是100,也会导致进度显示异常

修复方案

首先在类中定义两个成员变量:

// 持有倒计时实例
private CountDownTimer answerCountDownTimer;
// 标记按钮是否处于按住状态
private boolean isBtnAnswerPressing = false;

再修改pressBtnAnswer方法的逻辑:

private void pressBtnAnswer() {
    // 先给ProgressBar设置最大值为100,对应百分比进度
    progressBarAnswer.setMax(100);
    progressBarAnswer.setProgress(0);
    
    btnAnswer.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            int action = event.getAction();
            if (action == MotionEvent.ACTION_DOWN) {
                // 标记为按住状态
                isBtnAnswerPressing = true;
                // 先取消之前正在运行的计时器,避免重复创建
                if (answerCountDownTimer != null) {
                    answerCountDownTimer.cancel();
                }
                // 重置进度并显示进度条
                progressBarAnswer.setProgress(0);
                progressBarAnswer.setVisibility(View.VISIBLE);
                
                // 初始化倒计时,总时长2000ms,间隔500ms回调一次
                answerCountDownTimer = new CountDownTimer(2000, 500) {
                    @Override
                    public void onTick(long millisUntilFinished) {
                        // 直接用自己维护的按住状态判断,更可靠
                        if (isBtnAnswerPressing) {
                            progressBarAnswer.setProgress(progressBarAnswer.getProgress() + 25);
                        }
                    }

                    @Override
                    public void onFinish() {
                        if (isBtnAnswerPressing) {
                            // 计时完成且仍按住,重置进度、隐藏控件、执行业务方法
                            progressBarAnswer.setProgress(0);
                            progressBarAnswer.setVisibility(View.INVISIBLE);
                            showAnswer();
                            // 重置按住标记
                            isBtnAnswerPressing = false;
                        }
                    }
                }.start();
                return true;
            } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
                // 松开或者触摸事件被系统中断(比如来电、弹窗)时触发
                // 重置按住标记
                isBtnAnswerPressing = false;
                // 取消正在运行的计时器
                if (answerCountDownTimer != null) {
                    answerCountDownTimer.cancel();
                }
                // 重置进度条并隐藏
                progressBarAnswer.setProgress(0);
                progressBarAnswer.setVisibility(View.INVISIBLE);
                return true;
            }
            return false;
        }
    });
}

额外注意点

页面销毁时要主动取消计时器,避免内存泄漏:

@Override
protected void onDestroy() {
    super.onDestroy();
    if (answerCountDownTimer != null) {
        answerCountDownTimer.cancel();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:06:02