使用Handler和线程来实现计时器功能
1.xml布局
在drawable中添加yuan.xml如下
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="150dp"/>
<stroke android:width="3dp" android:color="#000000"/>
</shape>
可以自己随便找一个暂停和开始的图片也放在drawable中
然后再我们的layout中
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
android:gravity="center_horizontal"
android:background="#FFFF99"
>
<LinearLayout
android:layout_width="300dp"
android:layout_height="300dp"
android:background="@drawable/yuan"
android:orientation="vertical"
android:gravity="center_horizontal"
>
<TextView
android:id="@+id/titles"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="计时器"
android:textColor="#009999"
android:textSize="50sp"
android:layout_marginTop="60dp"
/>
<TextView
android:id="@+id/times"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="00:00"
android:textColor="#009999"
android:textSize="50sp"
android:layout_marginTop="60dp"
/>
</LinearLayout>
<ImageView
android:id="@+id/bnt"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/start"
android:layout_marginTop="45dp"
/>
<!--这里是作为后面的显示计时了多出时间-->
<TextView
android:id="@+id/txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#009999"
android:textSize="45sp"
android:text=""
android:layout_marginTop="45dp"
/>
</LinearLayout>
样式是这样的
2.MainActivity中
首先就要明确一下思路
1.点击按钮开始计时工作,并且能显示在UI页面上
2.使用点击事件,线程处理,并UI显示
(因为要使用Handler,所以推荐这个大佬,写的很好!!!)
1.首先当然是要先声明变量了
private TextView title,time,txt;
private ImageView bnt;
//给一个布尔判断的变量
private boolean flag =false;
2.初始化工作
title =findViewById(R.id.titles);
time = findViewById(R.id.times);
txt = findViewById(R.id.txt);
bnt = findViewById(R.id.bnt);
3.点击事件,计时器的开始和暂停
bnt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//上面设置过布尔的控制变量,这里判断就好判断了
if (flag == false){
//静止状态-->变为开始
flag = true;
title.setText("工作中");
bnt.setImageResource(R.drawable.stop);
txt.setText("");
//开启进程
new Thread(){
@Override
public void run() {
super.run();
//时间不停增长
//时间处理不在子线程中
int i = 1;
while (flag){
try {
sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
Message mesg = new Message();
mesg.arg1 = i;
handler.sendMessage(mesg);
//时间增加
i++;
}
}
}.start();
}else {
flag = false;
}
}
});
4.Handler的显示和处理
//用于区别当前按钮的点击,是启动还是关闭计时器
//控制while循环
private Handler handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
//启动
int min = msg.arg1/60;
int sec = msg.arg1 % 60;
//00:00
String timestr = (min <10 ? "0" +min:""+min)+":"+(sec<10 ? "0" +sec:""+sec);
time.setText(timestr);
//关闭计时器并显示记录时时间
if (flag == false){
title.setText("计时器");
bnt.setImageResource(R.drawable.start);
txt.setText("用时:"+timestr);
}
}
};
5.完整代码
public class MainActivity extends AppCompatActivity {
private TextView title,time,txt;
private ImageView bnt;
Button bnt2;
//用于区别当前按钮的点击,是启动还是关闭计时器
//2控制while循环
private boolean flag =false;
private Handler handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
//启动
int min = msg.arg1/60;
int sec = msg.arg1 % 60;
//00:00
String timestr = (min <10 ? "0" +min:""+min)+":"+(sec<10 ? "0" +sec:""+sec);
time.setText(timestr);
if (flag == false){
title.setText("计时器");
bnt.setImageResource(R.drawable.start);
txt.setText("用时:"+timestr);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
title =findViewById(R.id.titles);
time = findViewById(R.id.times);
txt = findViewById(R.id.txt);
bnt = findViewById(R.id.bnt);
bnt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (flag == false){
//静止状态-->变为开始
flag = true;
title.setText("工作中");
bnt.setImageResource(R.drawable.stop);
txt.setText("");
//开启进程
new Thread(){
@Override
public void run() {
super.run();
//时间不停增长
//时间处理不在子线程中
int i = 1;
while (flag){
try {
sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
Message mesg = new Message();
mesg.arg1 = i;
handler.sendMessage(mesg);
//时间增加
i++;
}
}
}.start();
}else {
flag = false;
}
}
});
}
}
6.效果
点击开始计时
点击暂停计时并显示计时时间
这样就实现了计时器功能。
Android萌新一枚,有问题望大佬指出,谢谢。