Android实现计时器功能

使用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用法及解析]

(因为要使用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萌新一枚,有问题望大佬指出,谢谢。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值