【问题标题】:My progressbar does not sync with my count down timer我的进度条与倒数计时器不同步
【发布时间】:2020-11-19 16:32:25
【问题描述】:

这里我做了这个方法来启动我的计时器,下面的一个更新计时器:

 private void startTimer()
{
    mCountDownTimer = new CountDownTimer(mTimeLeftInMillis, 1000) {
        @Override
        public void onTick(long millisUntilFinished) {
            mTimeLeftInMillis = millisUntilFinished;
            updateCountDownText();
            progress++;
            pb.setProgress((int)progress*100/((int)millisUntilFinished/1000));
        }

        @Override
        public void onFinish()
        {
            progress++;
            pb.setProgress(100);
            //Vibration
            if (Build.VERSION.SDK_INT >= 26)
            {
                ((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(VibrationEffect.createOneShot(150, VibrationEffect.DEFAULT_AMPLITUDE));
                Toast.makeText(MainActivity2.this,"Done",Toast.LENGTH_SHORT).show();
            }
            else
            {
                ((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(VibrationEffect.createWaveform(new long[]{150}, new int[]{VibrationEffect.EFFECT_CLICK},-1));
            }
        }
    }.start();
}


 private void updateCountDownText()
{

    //time in minutes and seconds
    int minutes = (int)(mTimeLeftInMillis/1000)/60;
    int seconds = (int)(mTimeLeftInMillis/1000)%60;
    //formating the above to appear as String
    String timeLeftFormatted = String.format("%02d:%02d",minutes,seconds);
    timer.setText(timeLeftFormatted);
}

“pb”是我的进度条的名称。它总是比倒计时早 2 分钟完成,我不知道如何同步它们。同样在完成后,振动由于某种原因没有被触发,即使它之前已经触发过。 “progress”作为全局变量初始化为零。

【问题讨论】:

    标签: java android android-studio wear-os


    【解决方案1】:

    解决办法如下:

    long millisInFuture;
    
    private void startTimer() {
        millisInFuture = mTimeLeftInMillis;
        mCountDownTimer = new CountDownTimer(mTimeLeftInMillis, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                mTimeLeftInMillis = millisUntilFinished;
                updateCountDownText();
                long millisPassed = millisInFuture - mTimeLeftInMillis;
                progress = (int) (millisPassed * 100 / millisInFuture);
                pb.setProgress(progress);
            }
    
            @Override
            public void onFinish() {
                pb.setProgress(100);
                Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    VibrationEffect effect =
                            VibrationEffect.createOneShot(150, VibrationEffect.DEFAULT_AMPLITUDE);
                    vibrator.vibrate(effect);
                    Toast.makeText(MainActivity2.this, "Done", Toast.LENGTH_SHORT).show();
                } else {
                    vibrator.vibrate(150);
                }
            }
        }.start();
    }
    

    【讨论】:

    • 我不知道它是否有效,因为计时器停止计数进度条仍在工作
    • @MohamedElKayal 如果您不知道,请尝试运行此代码并告诉我结果。
    • 我确实运行了它,我的意思是,在我运行之后,计数器不仅更新了进度条。我会尝试再次运行它,看看我是否遗漏了什么。
    • 您在评论中提到的“计数器”是您代码中的timer TextView,不是吗?
    • 我认为它正在等待它完成,提前感谢,是的,计数器是计时器 TextView。
    【解决方案2】:

    但我看不到您何时初始化进度条。 如果您设置 pb.max(或 Java 中的 setMax)= 100 并在每个 onTick 调用一个方法:

    private changePb(long millisUntilFinished){
        pb.progress = (millisUntilFinished / millisStartValue) * 100
    }
    

    millisStartValue 是您在 new CountDownTimer(mTimeLeftInMillis) 中输入的第一个值

    并且在 onFinish 中,您不必为进度条添加新值。

    【讨论】:

    • 我是否将进度条初始化为零?是这个意思吗?
    • 是的,只是检查进度条是否设置为最大值 = 100(可能在您的布局中)
    • max 设置为 100,进度设置为零,所以我在这里缺少什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 2017-12-15
    相关资源
    最近更新 更多