代码之家  ›  专栏  ›  技术社区  ›  Donal Rafferty

以秒为单位以00:00格式创建递增计时器?

  •  9
  • Donal Rafferty  · 技术社区  · 15 年前

    我想创建一个递增的第二个计时器,比如秒表。

    所以我想能够以00:01的格式显示秒和分钟的增量…

    谷歌只提供24小时制的例子,我想知道有没有人能让我开始一个我想做什么的例子或教程?

    编辑:

    这是到目前为止我在Android中使用的计时器

    在OnCeRead()中

        secondsT = 0;
        elapsedTimeBeforePause = 0;
    
        stopWatch.start();
        startTime = SystemClock.elapsedRealtime();
        stopWatch.setBase(elapsedTimeBeforePause);
    
         stopWatch.setOnChronometerTickListener(new OnChronometerTickListener(){
                @Override
                public void onChronometerTick(Chronometer arg0) {
                    //countUp is a long declared earlier
                    secondsT = (SystemClock.elapsedRealtime() - arg0.getBase()) / 1000;
                    String asText = (secondsT / 60) + ":" + (secondsT % 60); 
                    //textGoesHere is a TextView
                    ((TextView)findViewById(R.id.time)).setText(asText);
                }
         });
    

    在OnDebug()中

    @Override
    public void onDestroy() {
    
        inCall = false;
        elapsedTimeBeforePause = SystemClock.elapsedRealtime() - stopWatch.getBase();
    
        super.onDestroy();
    }
    

    上面编译并运行,但textView从不递增,它始终保持在0,有人知道为什么吗?

    2 回复  |  直到 11 年前
        1
  •  29
  •   Steve Haley    15 年前

    我假设你不知道安卓系统 Chronometer -它已经有了一个基本的秒表功能。你需要对它的特点进行一点研究,但是一旦你了解它是如何工作的,就不难让它做你想要做的事情。

    在手机上计算时间的方法有几种,但主要有两种:

    1. “实时”,比如现在根据我的电脑时钟,在英国是上午11:23。但是,如果我的计算机与时间服务器联系并被告知时间错误,或者如果我带着笔记本电脑旅行并跨越了时区边界,这可能会发生变化。使用它会对你的秒表造成严重破坏,因为测量的时间随时可能改变。

    2. “启动后经过的时间”,是指手机开机后的毫秒数。这个数字与实际时间没有任何关系,但它的行为将以完全可预测的方式进行。这就是安卓精密计时器的用途。

    这个 天文钟 本质上是一个“计数”计时器,比较电流 SystemClock.elapsedRealtime() 与为其基准时间设置的ElapseDrealtime()相反。两者之间的差除以1000,是计时器启动后的秒数。但是,如果您停止计时器,然后再次启动它,您将得到一个反直觉的结果-计时器将显示经过的时间,就好像它从未停止过一样。这是因为您需要调整它的基准时间,以考虑它被停止的时间。这很简单:

    // When you're stopping the stopwatch, use this
    // This is the number of milliseconds the timer was running for
    elapsedTimeBeforePause = SystemClock.elapsedRealtime() - timer.getBase();
    
    // When you're starting it again:
    timer.setBase(SystemClock.elapsedRealtime() - elapsedTimeBeforePause);
    

    编辑:这里是基本秒表的完整代码,它在文本视图中显示您的时间,而不是在XML文件中声明的计时器小部件。

    public class TestProject extends Activity {
        TextView textGoesHere;
        long startTime;
        long countUp;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            Chronometer stopWatch = (Chronometer) findViewById(R.id.chrono);
            startTime = SystemClock.elapsedRealtime();
    
            textGoesHere = (TextView) findViewById(R.id.textGoesHere);
            stopWatch.setOnChronometerTickListener(new OnChronometerTickListener(){
                @Override
                public void onChronometerTick(Chronometer arg0) {
                    countUp = (SystemClock.elapsedRealtime() - arg0.getBase()) / 1000;
                    String asText = (countUp / 60) + ":" + (countUp % 60); 
                    textGoesHere.setText(asText);
                }
            });
            stopWatch.start();
        }
    }
    

    在main.xml中,您需要

    <Chronometer android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/chrono"
        android:visibility="gone"/>
    

    毫无疑问,有一种方法可以让计时器在不在XML文件中声明的情况下工作,但是构造函数 Chronometer stopwatch = new Chronometer(this); 工作不正常。

    上面的代码以非常基本的方式显示经过的时间。例如,如果只有5秒过去,它将显示 0:5 而不是 0:05 你可能想要。解决这个问题并不难,但我会把它留给你去解决!:)

        2
  •  2
  •   jitter    15 年前

    这个怎么样 Digital Clock .

    但基本上,你应该能够通过Google查找Java,秒表,数字时钟等关键词来找到许多Java实现。

    你可以看看 Stopwatch Applet 并根据需要修改 (哎呀,这个没有消息来源)