Android Chronometer 计时器
Android Chronometer
(计时器) 可以用来制作一个简单的计时器或者倒计时
Chronometer
创建一个 Chronometer 很简单
<Chronometer android:layout_width="wrap_content" android:layout_height="wrap_content" />
下面我们就来制作一个简单的计时器吧
-
创建一个 空的 Android 项目
cn.twle.android.Chronometer
-
修改
activity_main.xml
添加两个按钮<?xml version="1.0" encoding="utf-8" ?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="8dp" android:orientation="vertical" > <Chronometer android:id="@+id/chronometer" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
-
修改
MainActivity.java
package cn.twle.android.chronometer; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Chronometer; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Chronometer chronometer = (Chronometer) findViewById(R.id.chronometer); chronometer.start(); } }
运行效果如下
默认情况下,Chronometer 控件会以 "MM:SS" 或 "H:MM:SS" 格式显示当前时间,我们也可以使用 setFormat(String)
方法设置为其它的格式
Chronometer 控件可以使用 elapsedRealtime()
方法设置起始时间,如果未设置起始时间,就会在调用 start()
方法时使用当前时间作为起始时间
Chronometer 控件也可以用来开发一个倒计时,可以使用 setCountDown(boolean)
方法来设置剩余时间
Chronometer 属性
属性 | 说明 |
---|---|
android:countDown | boolean, 设置 Chronometer 是否倒计时 |
android:format | string,设置 Chronometer 显示的格式,Android 会以第一个 %s 来代替 "MM:SS" or "H:MM:SS" |
Chronometer 主要方法
方法 | 说明 |
---|---|
isCountDown() | 设置是否倒计时 |
start() | 开启 Chronometer |
stop() | 停止 Chronometer |
范例: 完整的计时器
-
复用上面的 demo
-
修改 activity_main.xml 添加 Chronometer 和 四个按钮
<?xml version="1.0" encoding="utf-8" ?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Chronometer android:id="@+id/chronometer" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:textColor="#ff0000" android:textSize="60dip" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="10dip" android:orientation="horizontal"> <Button android:id="@+id/btnStart" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="开始记时" /> <Button android:id="@+id/btnStop" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="停止记时" /> <Button android:id="@+id/btnReset" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="重置" /> <Button android:id="@+id/btn_format" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="格式化" /> </LinearLayout> </LinearLayout>
-
修改 MainActivity.java
package cn.twle.android.chronometer; import android.os.SystemClock; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Chronometer; import android.widget.Button; import android.widget.Toast; import android.view.View; public class MainActivity extends AppCompatActivity implements View.OnClickListener,Chronometer.OnChronometerTickListener{ private Chronometer chronometer; private Button btn_start,btn_stop,btn_base,btn_format; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { chronometer = (Chronometer) findViewById(R.id.chronometer); btn_start = (Button) findViewById(R.id.btnStart); btn_stop = (Button) findViewById(R.id.btnStop); btn_base = (Button) findViewById(R.id.btnReset); btn_format = (Button) findViewById(R.id.btn_format); chronometer.setOnChronometerTickListener(this); btn_start.setOnClickListener(this); btn_stop.setOnClickListener(this); btn_base.setOnClickListener(this); btn_format.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btnStart: chronometer.start();// 开始计时 break; case R.id.btnStop: chronometer.stop();// 停止计时 break; case R.id.btnReset: chronometer.setBase(SystemClock.elapsedRealtime());// 复位 break; case R.id.btn_format: chronometer.setFormat("Time:%s");// 更改时间显示格式 break; } } @Override public void onChronometerTick(Chronometer chronometer) { String time = chronometer.getText().toString(); if(time.equals("00:00")){ Toast.makeText(MainActivity.this,"时间到了~",Toast.LENGTH_SHORT).show(); } } }
范例: 倒计时
-
复用上面的 demo
-
修改 activity_main.xml 添加 Chronometer 和 一个按钮
<?xml version="1.0" encoding="utf-8" ?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Chronometer android:id="@+id/chronometer" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:countDown="true" android:textColor="#ff0000" android:textSize="60dip" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="10dip" android:orientation="horizontal"> <Button android:id="@+id/btnStart" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="开始" /> <Button android:id="@+id/btnReset" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="重置" /> </LinearLayout> </LinearLayout>
-
修改 MainActivity.java
package cn.twle.android.chronometer; import android.os.SystemClock; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Chronometer; import android.widget.Toast; import android.widget.Button; import android.view.View; import java.text.SimpleDateFormat; import java.util.Date; import javax.xml.datatype.Duration; public class MainActivity extends AppCompatActivity implements View.OnClickListener,Chronometer.OnChronometerTickListener{ static final long Durtime = 3; private long leftTime = Durtime; private Chronometer chronometer; private Button btn_start,btn_stop,btn_base,btn_format; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { chronometer = (Chronometer) findViewById(R.id.chronometer); btn_start = (Button) findViewById(R.id.btnStart); btn_base = (Button) findViewById(R.id.btnReset); chronometer.setOnChronometerTickListener(this); btn_start.setOnClickListener(this); btn_base.setOnClickListener(this); setChronometerText(); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btnStart: chronometer.start();// 开始计时 break; case R.id.btnReset: chronometer.stop(); // 停止计时 chronometer.setBase(SystemClock.elapsedRealtime());// 复位 leftTime = Durtime; setChronometerText(); break; } } @Override public void onChronometerTick(Chronometer chronometer) { leftTime--; setChronometerText(); if(leftTime == 0 ){ Toast.makeText(MainActivity.this,"时间到了~",Toast.LENGTH_SHORT).show(); chronometer.stop(); return; } } public void setChronometerText() { Date d = new Date(leftTime * 1000); SimpleDateFormat timeFormat = new SimpleDateFormat("mm:ss"); chronometer.setText(timeFormat.format(d)); } }