android studio 写一个小计时器

as版本:

例程:timer

关键点:利用runnable和handler配合。

效果:

代码:

activety_main.xml

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv_timer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:textSize="30dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.272" />

    <Button
        android:id="@+id/btn_start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="36dp"
        android:layout_marginTop="80dp"
        android:text="开始"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tv_timer" />

    <Button
        android:id="@+id/btn_stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:text="停止"
        app:layout_constraintStart_toEndOf="@+id/btn_start"
        app:layout_constraintTop_toTopOf="@+id/btn_start" />

    <Button
        android:id="@+id/btn_clear"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:text="归零"
        app:layout_constraintStart_toEndOf="@+id/btn_stop"
        app:layout_constraintTop_toTopOf="@+id/btn_stop" />

</androidx.constraintlayout.widget.ConstraintLayout>

mainactivity.java

java 复制代码
package com.shudu.timer;

import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class MainActivity extends AppCompatActivity {
    private TextView tvTimer;
    private Button btnStart, btnStop, btnClear;
    private long startTime;
    private Handler handler = new Handler();

    private Runnable timerRunnable;
    private boolean isRunning = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
        tvTimer = findViewById(R.id.tv_timer);
        btnStart = findViewById(R.id.btn_start);
        btnStop = findViewById(R.id.btn_stop);
        btnClear = findViewById(R.id.btn_clear);

        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startTimer();
            }
        });

        btnStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stopTimer();
            }
        });

        btnClear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                clearTimer();
            }
        });


    }
    private void startTimer() {
        if (!isRunning) {
            startTime = System.currentTimeMillis();//开始时间为当前时间
            isRunning = true;//运行状态标志
            timerRunnable = new Runnable() {//runnable
                @Override
                public void run() {
                    long elapsedTime = System.currentTimeMillis() - startTime;//运行时间差
                    int seconds = (int) (elapsedTime / 1000);//计算秒
                    int minutes = seconds / 60;//计算分
                    seconds %= 60;//显示分钟后的剩余秒
                    int hours = minutes / 60;//计算小时
                    minutes %= 60;//计算显示小时后剩余的分钟数
                    String timeText = String.format("%02d:%02d:%02d", hours, minutes, seconds);//时分各种显示格式
                    tvTimer.setText(timeText);//修改textview
                    if (isRunning) {
                        handler.postDelayed(this, 1000);//延迟1秒显示
                    }
                }
            };
            handler.post(timerRunnable);
        }
    }

    private void stopTimer() {
        isRunning = false;
    }

    private void clearTimer() {
        isRunning = false;
//        startTime=0;
        startTime = System.currentTimeMillis();//这行代码什么意思,不写还不行。写成starttime=0也不行。
        tvTimer.setText("00:00:00");
    }
}

清除显示代码:

复制代码
private void clearTimer() {
        isRunning = false;
        startTime=0;
//        startTime = System.currentTimeMillis();//这行代码什么意思,不写还不行。写成starttime=0也不行。
        tvTimer.setText("00:00:00");
    }

starttime=0;或不写都会显示成下图这样:

不是想要的结果,必须写成:

复制代码
startTime = System.currentTimeMillis();

我也不知道是什么原因,估计是跟延迟显示有关,有懂的可以留言解释一下。

相关推荐
robotx2 小时前
安卓线程相关
android
消失的旧时光-19432 小时前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json
dalancon3 小时前
VSYNC 信号流程分析 (Android 14)
android
dalancon3 小时前
VSYNC 信号完整流程2
android
dalancon3 小时前
SurfaceFlinger 上帧后 releaseBuffer 完整流程分析
android
用户69371750013844 小时前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能
程序员Android5 小时前
Android 刷新一帧流程trace拆解
android
墨狂之逸才5 小时前
解决 Android/Gradle 编译报错:Comparison method violates its general contract!
android
阿明的小蝴蝶6 小时前
记一次Gradle环境的编译问题与解决
android·前端·gradle
汪海游龙6 小时前
开源项目 Trending AI 招募 Google Play 内测人员(12 名)
android·github