21
cmtr.setText(finalTime);
cmtr.setBase(SystemClock.elapsedRealtime());

timetest = SystemClock.elapsedRealtime();
Log.d("SETTIME: ", ""+timetest);
cmtr.start();

eltime = SystemClock.elapsedRealtime();
Log.d("ELapsed: ", ""+eltime);

注意:我想以相反的顺序启动我的计时器。就像我将计时器设置为 10 秒。现在,我想以相反的顺序从 10 秒到 0 秒开始。所以任何人都可以帮助获得这个解决方案。?非常感谢你。

4

6 回答 6

51

你不能,Chronometer小部件只会计数,这就是它的特定目的。如果您想倒计时,请使用CountDownTimer(Android SDK 页面包含更新 TextView 的特定示例),或推出您自己的解决方案。

这些类是简单的包装器,可以为您节省一些输入。如果它们不符合您的确切需求,您真的不应该对编写替代实现感到不舒服。

[更新]

正如 Ronaldo Bahia 在评论中添加的那样,自 API 24 起,Chronometer 实际上通过setCountDown方法提供了此功能。

于 2013-03-21T20:34:35.147 回答
22

您不能使用计时器小部件进行倒计时。使用下面的 CountDownTimer 示例,我的倒计时从 01:45 分钟 1 秒 = 1000 开始

 CountDownTimer cT =  new CountDownTimer(100000, 1000) {

         public void onTick(long millisUntilFinished) {


                 String v = String.format("%02d", millisUntilFinished/60000);
                 int va = (int)( (millisUntilFinished%60000)/1000);
                 textView.setText("seconds remaining: " +v+":"+String.format("%02d",va));
         }

         public void onFinish() {
             textView.setText("done!");
         }
      };
      cT.start();
于 2014-07-16T07:26:32.373 回答
3

对于那些仍在寻找其他选项和视图的人,我建议使用Chronometer小部件并将 setCountDown (boolean) 设置为 true。

例如,在您的活动或片段中:

  view_timer.base = SystemClock.elapsedRealtime() + 10000    
  view_timer.start()

对于布局 .xml 中的小部件:

<Chronometer
            android:id="@+id/view_timer"
            android:countDown="true"
            tools:targetApi="24"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
于 2019-03-26T15:04:45.277 回答
2

也可以使用 setCountDown(true); https://developer.android.com/reference/android/widget/Chronometer.html

于 2016-07-08T11:10:05.570 回答
2

计时表只计数。但是我们可以用这个小技巧来逆转。

chrono.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
            @Override
            public void onChronometerTick(Chronometer arg0) {
                countUp = (SystemClock.elapsedRealtime() - startTime) / 1000;

                if (countUp % 2 == 0) {
                    chronoRecordingImage.setVisibility(View.VISIBLE);
                } else {
                    chronoRecordingImage.setVisibility(View.INVISIBLE);
                }
                int min = (int) (countUp/60);
                int sec = (int) (countUp%60);

                Utility.printMessage(min+":"+sec);
                int newCount = MAX_TIME - (int) countUp;  // MAIN LOGIC
                String asText = String.format("%02d",(newCount / 60)) + ":"
                        + String.format("%02d", (newCount % 60));

                chrono.setText(asText);
                if (countUp > MAX_TIME) {
                    //time complete
                }
            }
        });
于 2016-08-08T07:30:29.500 回答
0
private static int sec = 60*2;  // this is for 2 for min TODO replace your sec

    public void startTimer(final TextView textView ,int sec) {

    CountDownTimer downTimer= new CountDownTimer(1000 * sec, 1000) {

        public void onTick(long millisUntilFinished) {


            String v = String.format("%02d", millisUntilFinished / 60000);
            int va = (int) ((millisUntilFinished % 60000) / 1000);
            textView.setText(v + ":" + String.format("%02d", va));
        }

        public void onFinish() {
            textView.setText("done!");
        }
    };
    downTimer.start();

}

并称之为:

startTimer(tvClock,sec);
于 2018-02-21T00:04:50.787 回答