无法获得暂停和恢复功能以使用进度条

时间:2017-04-06 19:00:17

标签: android mobile progress

我正在尝试使用圆形进度条创建计时器。我找到了一个以http://www.androidtutorialshub.com/android-count-down-timer-tutorial/开头的好例子。这个例子有我需要的外观,但我想为它添加暂停和恢复功能。所以,我确实有暂停和恢复工作,但是在我点击“暂停”然后“恢复”后,进度条从头开始吐一秒钟,然后从位置暂停开始恢复(这是目标)。我的猜测是进度条在某处设置为100%然后用暂停位置替换,但我找不到可能发生的部分。

修改后的mainActivity代码:

public class MainActivity extends AppCompatActivity {

    private long timeCountInMilliSeconds = 1 * 60000;
    long startTime;
    long difference;
    long difference1;
    private enum TimerStatus {
        STARTED,
        STOPPED,
    }

    private TimerStatus timerStatus = TimerStatus.STOPPED;

    private ProgressBar progressBarCircle;
    private EditText editTextMinute;
    private TextView textViewTime;
    private ImageView imageViewReset;
    private ImageView imageViewStartStop;
    private CountDownTimer countDownTimer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        progressBarCircle = (ProgressBar) findViewById(R.id.progressBarCircle);
        editTextMinute = (EditText) findViewById(R.id.editTextMinute);
        textViewTime = (TextView) findViewById(R.id.textViewTime);
        imageViewReset = (ImageView) findViewById(R.id.imageViewReset);
        imageViewStartStop = (ImageView) findViewById(R.id.imageViewStartStop);

        imageViewReset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                reset();
            }
        });

        imageViewStartStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                pauseResume();
            }
        });
    }

    private void reset() {
        stopCountDownTimer();
        restartCountDownTimer();
    }

    private void pauseResume() {
        if (timerStatus == TimerStatus.STOPPED) {
            timeCountInMilliSeconds = 1 * 50000;
           // setProgressBarValues(timeCountInMilliSeconds);
            progressBarCircle.setMax((int) (timeCountInMilliSeconds) / 1000);
            progressBarCircle.setProgress((int) (timeCountInMilliSeconds) / 1000);
            imageViewReset.setVisibility(View.VISIBLE);
            imageViewStartStop.setImageResource(R.drawable.icon_stop);
            editTextMinute.setEnabled(false);
            timerStatus = TimerStatus.STARTED;
            startCountDownTimer();
            startTime = System.currentTimeMillis();

        } else {
            imageViewReset.setVisibility(View.GONE);
            imageViewStartStop.setImageResource(R.drawable.icon_start);
            editTextMinute.setEnabled(true);
            timerStatus = TimerStatus.STOPPED;
            stopCountDownTimer();
            if(difference == 0) {
                difference = System.currentTimeMillis() - startTime;
            }
            else{
                difference1 = System.currentTimeMillis() - startTime;
                difference += difference1;}
        }

    }

    private void startCountDownTimer() {
        countDownTimer = new CountDownTimer(timeCountInMilliSeconds - difference, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                textViewTime.setText(hmsTimeFormatter(millisUntilFinished));
                progressBarCircle.setProgress((int) (millisUntilFinished / 1000));
            }

            @Override
            public void onFinish() {

                textViewTime.setText(hmsTimeFormatter(timeCountInMilliSeconds - difference));
               // setProgressBarValues(timeCountInMilliSeconds - difference);
                progressBarCircle.setMax((int) (timeCountInMilliSeconds - difference) / 1000);
                progressBarCircle.setProgress((int) (timeCountInMilliSeconds - difference) / 1000);
                imageViewReset.setVisibility(View.GONE);
                imageViewStartStop.setImageResource(R.drawable.icon_start);
                editTextMinute.setEnabled(true);
                timerStatus = TimerStatus.STOPPED;
            }
        }.start();
        countDownTimer.start();
    }

    private void restartCountDownTimer() {
        difference = 0;
        difference1 = 0;
        countDownTimer = new CountDownTimer(timeCountInMilliSeconds, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                textViewTime.setText(hmsTimeFormatter(millisUntilFinished));
                progressBarCircle.setProgress((int) (millisUntilFinished / 1000));
            }

            @Override
            public void onFinish() {

                textViewTime.setText(hmsTimeFormatter(timeCountInMilliSeconds));
              //  setProgressBarValues(timeCountInMilliSeconds);
                progressBarCircle.setMax((int) (timeCountInMilliSeconds) / 1000);
                progressBarCircle.setProgress((int) (timeCountInMilliSeconds) / 1000);
                imageViewReset.setVisibility(View.GONE);
                imageViewStartStop.setImageResource(R.drawable.icon_start);
                editTextMinute.setEnabled(true);
                timerStatus = TimerStatus.STOPPED;
            }
        }.start();
        countDownTimer.start();
    }

    private void stopCountDownTimer() {
        countDownTimer.cancel();

    }

    private String hmsTimeFormatter(long milliSeconds) {

        String hms = String.format("%02d:%02d:%02d",
                TimeUnit.MILLISECONDS.toHours(milliSeconds),
                TimeUnit.MILLISECONDS.toMinutes(milliSeconds) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milliSeconds)),
                TimeUnit.MILLISECONDS.toSeconds(milliSeconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliSeconds)));
        return hms;
    }
}

XML文件与上面提供的链接(示例代码的链接)相同。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

错误可能在pauseResume。你说progressBarCircle.setProgress((int) (timeCountInMilliSeconds) / 1000);。这会将当前进度设置为指定值。在您的情况下,这意味着与您的最大值相同的值。我认为你应该将整个块移到onCreate方法中。

timeCountInMilliSeconds = 1 * 50000;
progressBarCircle.setMax((int) (timeCountInMilliSeconds) / 1000);
progressBarCircle.setProgress((int) (timeCountInMilliSeconds) / 1000);

在开始时初始化这些值应该足够了。

<强> [编辑]

这种行为对我来说似乎很好。假设你按下暂停,如果定时器是47秒,现在取决于你的定时,定时器可以暂停999毫秒或001毫秒。 (指向边缘情况)。在第一种情况下,你必须等待“接近”一秒钟,精确到999毫秒,直到定时器明显切换到状态。在秒的情况下,感觉应用程序直接响应,因为您只需要等待001毫秒。如果您想解决此问题,请将difference值标准化为:

private void pauseResume() {
    if (timerStatus == TimerStatus.STOPPED) {
        ...
    } else {
        ...
        difference += (((int) (System.currentTimeMillis() - startTime) / 1000) + 1) * 1000;
    }

}

我还删除了无用的difference1变量。 我做了另一项改进,我删除了if else语句,因为它也没用。 您也可以删除+ 1以始终等待1秒。在你看到视觉效果之前。