安卓系统是内置了计时器(Chronometer)的,但是不很强大,只能显示以秒为单位的计时。如果要具体到毫秒级,就要自己写方法实现了。因为Chronometer这个组件灰常简单,提供的api方法也少,可直接通过例子了解。


计时器(Chronometer)的核心方法有:

start()   //开始计时

stop() //结束计时

setBase() //设置开始时间,一般使用SystemClock.elapsedRealtime()获取当前开始的时间,从00 : 00开始计时

setFormat() //设置计时格式, 比如setFormat( "计时开始:%s" );  //s%就是默认的 MM : SS格式

setOnChronometerTickListenter() //设置计时器的监听器,当计时的值改变会调用这个监听器;如果要清除所添加的监听器,使用setOnChronometerTickListener(null)即可。


先上个演示图:

android 时钟的计时 安卓计时器在哪里_安卓视图组件


布局XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/ll_frg_ob_main"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="horizontal"
        >
        <Button
            android:id="@+id/btn_ob_start"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="开始"
            />
        <Button
            android:id="@+id/btn_ob_cancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="结束"
            android:layout_marginLeft="20dp"
            />
        <Button
            android:id="@+id/btn_ob_wait"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="三秒后自动结束"
            android:layout_marginLeft="20dp"
            />
     </LinearLayout>


    <Chronometer
        android:id="@+id/chron_main"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:layout_below="@+id/ll_frg_ob_main"
        android:layout_marginTop="20dp"
        android:gravity="center"
        android:textSize="18sp"
        android:background="#DDDDDD"
        />


</RelativeLayout>


主类Activity的核心方法:

/**
     * 设定3秒后自动结束计时器
     */
    private void setTickListener()
    {
        //添加监听器,每次计时器的时间改变都会触发这个监听器,3秒后自动结束
        chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
            @Override
            public void onChronometerTick(Chronometer chronometer) {
                if(SystemClock.elapsedRealtime() - chronometer.getBase() >= 3000)
                {
                    chronometer.stop();
                }
            }
        });
    }

    private class MyOnClickListener implements View.OnClickListener{
        @Override
        public void onClick(View v)
        {
            if(v == btn_start)
            {
                //去除添加的监听器,因为setTickListener()方法中添加的监听器如果不被去除,会一直限制在3秒自动结束。
                chronometer.setOnChronometerTickListener(null);
                //设置开始计时的时间点
                chronometer.setBase(SystemClock.elapsedRealtime());
                //开始计时,默认样式是 00:00
                chronometer.start();
            }
            else if(v == btn_cancel)
            {
                //停止计时
                chronometer.stop();
            }
            else if(v == btn_wait)
            {
                chronometer.stop();
                chronometer.setBase(SystemClock.elapsedRealtime());
                setTickListener();
                chronometer.start();
            }
        }
    }



上面就是计时器( Chronometer )的使用过程。Chronometer 只能满足一般的使用场景,而且也不是常用的组件。如果要实现比如精确到毫秒,或者复杂格式的计时器,就要考虑用自定义的一系列方法去实时计时,并把计时的结果不断刷新写入要显示数字的组件( 比如TextView )中。

为什么要这么做?我们去看看Chronometer的源码,就会发现其实计时器是继承了TextView的子类,本质上其实也是一个文本框,至于它如何实现逐秒逐秒的计时,也是使用了sendMessageDelayed(Message.obtain(this, TICK_WHAT), 1000);这样的方法去计时,用handler每次延时1秒去发送信息,然后刷新计时的结果,就成了我们在视图所看到的一秒一秒增加的效果。了解了这个过程,要自己去实现计时器,也就不难了吧。