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();

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

相关推荐
安静的_显眼包O_o44 分钟前
SUBSTRING_INDEX()在MySQL中的用法
android·数据库·mysql
阿松のblog1 小时前
蓝桥杯JAVA刷题--001
android·java·蓝桥杯
起个随便的昵称2 小时前
安卓入门一 Java基础
android·java·开发语言
tealcwu2 小时前
【游戏设计原理】41 - 游戏的核心
android·服务器·游戏
limingade4 小时前
手机实时提取SIM卡打电话的信令声音-双卡手机来电如何获取哪一个卡的来电
android·智能手机·蓝牙电话·手机提取通话声音·多sim卡来电识别
码上就位4 小时前
如何在IDEA一个窗口中导入多个项目
java·ide·intellij-idea
林鸿群5 小时前
Android实现队列出入队测试
android
NINO5 小时前
ANR分析-kswapd0
android
如果可以0035 小时前
Android Camera系列(八):MediaCodec视频编码下-OpenGL ES离屏渲染
android·音视频·mediacodec·opengl es
悟道子HD5 小时前
phpstudy2018问题(技巧)总结
android·java·开发语言