【问题标题】:Set progressbar position设置进度条位置
【发布时间】:2019-06-30 16:38:51
【问题描述】:

我需要进度条巫婆位置取决于以毫秒为单位的两个时间戳值,因此它取决于未来时间戳、过去时间戳和当前时间戳。

例如,我的时间戳为 08:46:11 30.06.2019 和 10:46:11 30.06.2019。但是当前时间是 09:46:11 30.06.2019,所以现在进度条应该填充 50% 并上升到 100 直到 10:46:11 30.06.2019

我已经尝试了下一个代码,但现在我明白使用 CountDownTimer 是没用的,它不适合我上面描述的任务:

private void progressBar(){
            prBar.setProgress(i);
            mCountDownTimer=new CountDownTimer(ltimestampStop * 1000,ltimestampStart * 1000) {

                @Override
                public void onTick(long millisUntilFinished) {
                    Log.v("Log_tag", "Tick of Progress"+ i+ millisUntilFinished);
                    i++;
                    int Start = ltimestampStart.intValue();
                    int Stop = ltimestampStop.intValue();
                    prBar.setProgress((int)i*100/(Stop/Start));

                }

                @Override
                public void onFinish() {
                    //Do what you want
                    i++;
                    prBar.setProgress(100);
                }
            };
            mCountDownTimer.start();
        }

那么我应该怎么做才能在取决于未来时间、过去时间和现在时间的某个位置创建进度条?

【问题讨论】:

    标签: android timestamp progress-bar


    【解决方案1】:

    您可以尝试以下操作:

    long startTimeInMillis = ...;     // 08:46:11 30.06.2019
    long stopTimeInMillis = ...;      // 10:46:11 30.06.2019
    long currentTimeInMillis = ...;   // 09:46:11 30.06.2019
    long totalTimeInMilis = stopTimeInMillis - startTimeInMillis;
    
    // Standart logic
    long remainingTimeInMillis = stopTimeInMillis - currentTimeInMillis;
    // But this line assures remaining time is not greater than total time
    long remainingTimeInMillis = currentTimeInMillis < startTimeInMillis ?
            totalTimeInMilis : stopTimeInMillis - currentTimeInMillis;
    
    // Update every second
    long countDownIntervalInMillis = 1000;
    // Alternatively you can adjust interval such that it is called only in integer percent changes
    int remainingSteps = (int) (((double) remainingTimeInMillis / totalTimeInMilis) * 100);
    long countDownIntervalInMillis = remainingTimeInMillis / remainingSteps;
    
    mCountDownTimer = new CountDownTimer(remainingTimeInMillis, countDownIntervalInMillis) {
    
        @Override
        public void onTick(long millisUntilFinished) {
            int completedPercent = (int) ((1 - (double) millisUntilFinished / totalTimeInMilis) * 100);
            prBar.setProgress(completedPercent);
        }
    
        @Override
        public void onFinish() {
            // Do what you want
            prBar.setProgress(100);
        }
    };
    mCountDownTimer.start();
    

    【讨论】:

    • 我已经尝试了您的代码的所有变体,但它在设备上不正确:进度条的位置总是从一个位置闪烁到另一个位置。第一个位置是随机的。
    • 所以如果long countDownIntervalInMillis = 1000; - 比闪烁更快,如果另一个变种 - 闪烁更慢
    • 你能试试第二种计算countDownIntervalInMillis的方法吗?一开始你会得到多少remainingSteps?另外,您的开始和停止时间是以毫秒为单位的吗?
    • 取决于调试器信息:所有时间戳都以毫秒为单位,remainingSteps = 6startTimeInMillis = 1561920000000stopTimeInMillis = 1561927200000currentTimeInMillis = 1561926720005totalTimeInMilis = 7200000countDownIntervalInMillis = 79999remainingTimeInMillis = 479995
    • 我不确定闪烁,但您的时间值对于测试来说太大了。您可以尝试使用像startTimeInMillis=1000stopTimeInMillis=11000currentTimeInMillis=6000countDownIntervalInMillis=1000 这样的小值吗?它应该从 %50 开始,分 5 步完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 2011-04-19
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    相关资源
    最近更新 更多