android studio 写一个小计时器(版本二)
as版本:23.3.1patch2
例程:timer
在前一个版本的基本上改的,增加了继续的功能,实现方法稍微不同。
动画演示:

activity_main.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"><Buttonandroid:id="@+id/btn_clear"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="144dp"android:layout_marginTop="60dp"android:text="清零"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/btn_stop" /><TextViewandroid: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" /><Buttonandroid: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" /><Buttonandroid: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" /><Buttonandroid:id="@+id/btn_resume"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
package com.shudu.timer;
//按钮控制显示计时器。
//开始、暂停、继续、清零四个按钮
//2024.12.30import 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, btnPause, btnResume,btnClear;private Handler handler = new Handler();private long startTime=0;private long elapsedTime = 0;private Runnable timerRunnable;private boolean isRunning = false;private boolean isPaused = false;@Overrideprotected 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);btnPause = findViewById(R.id.btn_stop);btnResume = findViewById(R.id.btn_resume);btnClear=findViewById(R.id.btn_clear);btnClear.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {clearTimer();}});btnStart.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (!isRunning) {startTime = System.currentTimeMillis();isRunning = true;handler.postDelayed(updateTimer, 0);}}});btnPause.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (isRunning &&!isPaused) {isPaused = true;elapsedTime += System.currentTimeMillis() - startTime;handler.removeCallbacks(updateTimer);}}});btnResume.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (isPaused) {isPaused = false;startTime = System.currentTimeMillis();handler.postDelayed(updateTimer, 0);}}});}private void clearTimer() {isRunning = false;
// startTime=0;startTime = System.currentTimeMillis();//这行代码什么意思,不写还不行。写成starttime=0也不行。tvTimer.setText("00:00:00");}private Runnable updateTimer = new Runnable() {@Overridepublic void run() {long currentTime;if (isRunning) {if (isPaused) {currentTime = elapsedTime;} else {currentTime = System.currentTimeMillis() - startTime + elapsedTime;}int seconds = (int) (currentTime / 1000);int minutes = seconds / 60;int hours = minutes / 60;seconds %= 60;minutes %= 60;tvTimer.setText(String.format("%02d:%02d:%02d", hours, minutes, seconds));handler.postDelayed(this, 1000);}}};
}
相关文章:
android studio 写一个小计时器(版本二)
as版本:23.3.1patch2 例程:timer 在前一个版本的基本上改的,增加了继续的功能,实现方法稍微不同。 动画演示: activity_main.xml <?xml version"1.0" encoding"utf-8"?> <androidx…...
【网络安全实验室】SQL注入实战详情
如果额头终将刻上皱纹,你只能做到,不让皱纹刻在你的心上 1.最简单的SQL注入 查看源代码,登录名为admin 最简单的SQL注入,登录名写入一个常规的注入语句: 密码随便填,验证码填正确的,点击登录…...
华为,新华三,思科网络设备指令
1. 设备信息查看 华为 display version # 查看设备版本信息 display device # 查看设备硬件信息 新华三(H3C) display version # 查看设备版本信息 display device # 查看设备硬件信息 锐捷 show version …...
WebRTC线程的启动与运行
WebRTC线程运行的基本逻辑: while(true) {…Get(&msg, …);…Dispatch(&msg);… }Dispatch(Message *pmsg) {…pmsg->handler->OnMessage(pmsg);… }在执行函数内部,就是一个while死循环,只做两件事,从队列里Get取…...
Day3 微服务 微服务保护(请求限流、线程隔离、服务熔断)、Sentinel微服务保护框架、分布式事务(XA模式、AT模式)、Seata分布式事务框架
目录 1.微服务保护 1.1.服务保护方案 1.1.1 请求限流 1.1.2 线程隔离 1.1.3 服务熔断 1.2 Sentinel 1.2.1.介绍和安装 1.2.2 微服务整合 1.2.2.1 引入sentinel依赖 1.2.2.2 配置控制台 1.2.2.3 访问cart-service的任意端点 1.3 请求限流 1.4 线程隔离 1.4.1 OpenFeign整合Senti…...
第9章 子程序与函数调用
汇编语言是一种低级编程语言,它几乎是一对一地映射到计算机的机器码指令。在汇编语言中实现循环结构通常涉及到使用条件跳转指令(如 JMP、JE、JNE 等)来控制程序流程。下面我将通过一个简单的例子来讲解如何用x86汇编语言实现一个循环结构。 …...
manacher算法
Manacher 算法快速入门 Manacher 算法是一种用于寻找字符串中最长回文子串的高效算法,时间复杂度为 O(n)。 基本概念 回文 回文是一个字符串,从左到右和从右到左读都一样。 示例: 回文:"aba"、"abba"非回…...
Cocos2dx Lua绑定生成中间文件时参数类型与源码类型不匹配
这两天维护的一个项目,使用arm64-v8a指令集编译时遇到了报错,提示类型不匹配,具体报错的代码【脚本根据C源文件生成的中间文件】如下: const google::protobuf::RepeatedField<unsigned long long>& ret cobj->equi…...
为什么需要 std::call_once?
std::call_once 是 C 标准库中的一个函数,用来确保某个操作仅被执行一次,通常用于线程安全的初始化操作。它常与 std::once_flag 结合使用,后者用于标记某个操作是否已经执行过。 为什么需要 std::call_once? 在多线程程序中&am…...
ubuntu非root用户操作root权限问题-virbox挂在共享文件夹
首先讲一下,virtuallbox 挂在文件夹,操作的时候总是需要root权限,比较费劲。 这一操作其实也正对着我们在Ubuntu上的操作。 前段时间我想在ubuntu正常用户下去操作i2c,也出现了类似的问题。 后来把正常的操作加到组里面也解决了类…...
网络通讯协议
层次协议应用层HTTP, HTTPS, FTP, SMTP, POP3, IMAP, DNS, DHCP, SNMP, Telnet, SSH, SIP, RTP, RTCP, TFTP, NTP, ICMP, IGMP传输层TCP, UDP网络层IP, ICMP, IGMP数据链路层Ethernet, PPP, HDLC, ATM, Frame Relay ISO/OSI 参考模型协议应用层HTTP, HTTPS, FTP, SMTP, POP3, …...
centos,789使用mamba快速安装devtools
如何进入R语言运行环境请参考:Centos7_miniconda_devtools安装_R语言入门之R包的安装_r语言devtools包怎么安装-CSDN博客 在R里面使用安装devtools经常遇到依赖问题,排除过程过于费时,使用conda安装包等待时间长等。下面演示centos,789都是一…...
【人工智能机器学习基础篇】——深入详解强化学习之常用算法Q-Learning与策略梯度,掌握智能体与环境的交互机制
深入详解强化学习之常用算法:Q-Learning与策略梯度 强化学习(Reinforcement Learning, RL)作为机器学习的一个重要分支,近年来在多个领域取得了显著成果。从棋类游戏的人机对战到自主驾驶汽车,强化学习技术展示了其强大…...
银河麒麟桌面v10sp1修复引导笔记
1.安装双系统最好备份esp分区,uefi引导丢失可以用diskgen,选择工具再点击设置uefi bios,鼠标右键选择efi文件。 2.银河麒麟界面添加windows,复制EFI/Microsoft或者pe生成引导文件后,修复Windows引导用下面命令 /桌面# update-gru…...
深入理解 MVCC 与 BufferPool 缓存机制
深入理解 MVCC 与 BufferPool 缓存机制 在 MySQL 数据库中,MVCC(Multi-Version Concurrency Control)多版本并发控制机制和 BufferPool 缓存机制是非常重要的概念,它们对于保证数据的一致性、并发性以及提升数据库性能起着关键作用…...
vue实现下拉多选、可搜索、全选功能
最后的效果就是树形的下拉多选,可选择任意一级选项,下拉框中有一个按钮可以实现全选,也支持搜索功能。 在mounted生命周期里面获取全部部门的数据,handleTree是讲接口返回的数据整理成树形结构,可以自行解决 <div c…...
探秘Kafka源码:关键内容解析
文章目录 一、以kafka-3.0.0为例1.1安装 gradle 二、生产者源码2.1源码主流程图2.2 初始化2.3生产者sender线程初始化2.4 程序入口2.5生产者 main 线程初始化2.6 跳转到 KafkaProducer构造方法 一、以kafka-3.0.0为例 打开 IDEA,点击 File->Open…->源码包解…...
Android音频效果处理:基于`android.media.audiofx`包的原理、架构与实现
Android音频效果处理:基于android.media.audiofx包的原理、架构与实现 目录 引言Android音频框架概述android.media.audiofx包简介音频效果处理的原理 4.1 音频信号处理基础4.2 常见音频效果android.media.audiofx的架构设计 5.1 类结构分析5.2 设计模式应用系统定制与扩展 6…...
LeetCode - 初级算法 数组(两个数组的交集 II)
两个数组的交集 II 这篇文章讨论如何求两个数组的交集,并返回结果中每个元素出现的次数与其在两个数组中都出现的次数一致。提供多个实现方法以满足不同场景需求。 免责声明:本文来源于个人知识与公开资料,仅用于学术交流。 描述 给定两个整数数组 nums1 和 nums2,以数…...
SQL 实战:分页查询的多种方式对比与优化
在处理大数据表时,分页查询是非常常见的需求。分页不仅可以提高用户体验,还能有效减少数据库查询返回的数据量,避免一次性加载大量记录引起的性能瓶颈。 然而,在数据量较大或复杂查询中,简单的分页方式可能导致性能下降…...
2026届学术党必备的六大AI辅助论文工具实际效果
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 知网在近期对自己的 AIGC 检测服务进行了升级,其目的在于识别存在于论文之中的、…...
119. 使用 Fluentd concat 过滤器插件在牧场日志中串接多行日志
Situation 地理位置Logs of multiple lines are separated across multiple log events within Pod logs and there is a need to combine them into a single event before forwarding them to a logging solution. 多行日志在 Pod 日志中被分隔在多个日志事件中,…...
告别官方解锁后,我们还能怎么玩?深挖华为荣耀解BL的三种野路子与工具链
华为荣耀设备解锁技术深度解析:原理、工具与风险规避 在移动设备定制化需求日益增长的今天,安卓系统的Bootloader解锁成为技术爱好者绕不开的话题。特别是对于华为和荣耀设备用户而言,自2018年官方关闭解锁服务后,这一过程变得更…...
终极指南:如何用3分钟为Windows换上《蔚蓝档案》风格光标主题
终极指南:如何用3分钟为Windows换上《蔚蓝档案》风格光标主题 【免费下载链接】BlueArchive-Cursors Custom mouse cursor theme based on the school RPG Blue Archive. 项目地址: https://gitcode.com/gh_mirrors/bl/BlueArchive-Cursors 每天面对电脑工作…...
安规标准考核题库-2(IEC 62477-1:2012+AMD1:2022 )
本题库严格对标 IEC 62477-1:2012《电力电子变换器系统和设备安全要求 第 1 部分:总则》AMD1:2022 修订版,贴合储能双向 PCS 的设计、测试、认证全流程场景,分为判断题、单选题、多选题三类,所有题目均附标准条款依据与详细解答。…...
收藏备用!大模型3种调用模式详解,重点吃透RAG技术(小白/程序员入门必看)
对于刚接触大模型开发的小白、程序员来说,最困惑的莫过于“怎么用大模型”“如何避免AI瞎胡说”“不同场景该选哪种调用方式”。今天这篇文章,就把大模型最核心的3种调用模式讲透,重点拆解能解决AI幻觉、适配多场景的RAG技术,结合…...
重塑暗黑2单机体验:d2s-editor 3大革新功能与技术解析
重塑暗黑2单机体验:d2s-editor 3大革新功能与技术解析 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor d2s-editor 是一款开源的暗黑2存档编辑工具,通过直观的图形界面实现角色属性调整、装备管理和高级合…...
Linux实时查看CUDA显卡使用情况的常用命令详解
在 Linux 系统中,你可以使用以下几个常用命令来实时查看 CUDA 显卡的情况:1. nvidia-smi 命令nvidia-smi(NVIDIA System Management Interface)是 NVIDIA 提供的一个命令行工具,它可以实时显示 NVIDIA GPU 的状态信息&…...
AI 模型训练中的梯度裁剪技巧
AI模型训练中的梯度裁剪技巧 在深度学习的模型训练过程中,梯度爆炸是一个常见的问题,它会导致模型参数更新过大,进而使训练过程变得不稳定甚至无法收敛。为了解决这一问题,梯度裁剪(Gradient Clipping)技术…...
intv_ai_mk11部署教程:公网IP+端口直连的安全加固方案(反向代理+访问限流)
intv_ai_mk11部署教程:公网IP端口直连的安全加固方案(反向代理访问限流) 1. 环境准备与快速部署 1.1 系统要求 操作系统:Ubuntu 20.04/22.04 LTSGPU:NVIDIA显卡(至少16GB显存)内存࿱…...
