如何实现按住按钮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
相关产品推荐
相关产品推荐

