学习Android的第十三天
目录
Android TextClock 文本时钟控件
TextClock 控件主要属性和方法
简单的 TextClock
参考文档
Android AnalogClock 控件
AnalogClock 属性
Android Chronometer 计时器
Chronometer 属性
Chronometer 主要方法
范例: 完整的计时器
范例: 倒计时
Android TextClock 文本时钟控件
Android TextClock 是一个用于在 Android 应用中显示当前日期和时间的控件。它在 Android 4.2 (API 17) 后推出,并提供了两种不同的格式:24 小时制和 12 小时制。
可以使用 is24HourModeEnabled() 方法来确定系统当前是否在使用 24 小时制。在 24 小时制模式下,系统将按照以下方式进行判断:
- 首先尝试通过 getFormat24Hour() 方法获取时间格式。
- 如果无法获取到时间格式,则尝试通过 getFormat12Hour() 方法获取时间格式。
- 如果上述两种方式都无法获取到时间格式,则使用默认格式。
TextClock 控件主要属性和方法
下面是 TextClock 控件的主要属性和对应的方法:
属性:
- android:format12Hour:设置 12 小时制的格式。
- android:format24Hour:设置 24 小时制的格式。
- android:timeZone:设置时区。
方法:
- setFormat12Hour(CharSequence format):设置 12 小时制的时间格式。参数 format 是一个 CharSequence 对象,用于指定要显示的时间格式。
- setFormat24Hour(CharSequence format):设置 24 小时制的时间格式。参数 format 是一个 CharSequence 对象,用于指定要显示的时间格式。
- setTimeZone(String timeZone):设置 TextClock 控件的时区。参数 timeZone 是一个字符串,表示要设置的时区。
简单的 TextClock
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:app="http://schemas.android.com/apk/res-auto"android:orientation="vertical"android:gravity="center"><TextClockandroid:id="@+id/textClock"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:textSize="24sp"android:format24Hour="HH:mm:ss"android:format12Hour="hh:mm:ss a"android:timeZone="GMT+08:00"/>
</LinearLayout>
参考文档
- Android android.widget.TextClock
Android AnalogClock 控件
Android AnalogClock 控件是一个模拟时钟控件,用于在应用中显示模拟时钟的外观。但是,自 API 23 起,Android 官方已经将 AnalogClock 控件标记为废弃,并建议开发者使用其他替代方案,比如使用自定义绘制的方式或者使用第三方库来实现时钟功能。
AnalogClock 属性
在 Android 中,AnalogClock 控件是一个简单的模拟时钟,它显示了当前时间的模拟时钟表盘。尽管从 API 23 开始已经被废弃,但仍然可以使用。下面是 AnalogClock 控件的属性说明:
- android:dial:用于设置模拟时钟的背景图片。您可以指定一个 drawable 资源作为时钟的表盘背景。这个属性允许您自定义时钟表盘的外观。
- android:hand_hour:用于设置模拟时钟的时针图片。您可以指定一个 drawable 资源作为时钟的时针。这个属性允许您自定义时钟的时针外观。
- android:hand_minute:用于设置模拟时钟的分针图片。您可以指定一个 drawable 资源作为时钟的分针。这个属性允许您自定义时钟的分针外观。
Android Chronometer 计时器
Android 中的 Chronometer 控件可以用于制作简单的计时器或倒计时功能。它可以显示经过的时间,并且可以方便地开始、停止和重置计时。
默认情况下,Chronometer 控件会以 "MM:SS" 或 "H:MM:SS" 格式显示当前时间,我们也可以使用 setFormat(String) 方法设置为其它的格式
Chronometer 控件可以使用 elapsedRealtime() 方法设置起始时间,如果未设置起始时间,就会在调用 start() 方法时使用当前时间作为起始时间
Chronometer 控件也可以用来开发一个倒计时,可以使用 setCountDown(boolean) 方法来设置剩余时间
Chronometer 属性
- android:countDown:一个布尔值,用于设置 Chronometer 是否为倒计时模式。如果设置为 true,则 Chronometer 将显示倒计时的时间;如果设置为 false(默认值),则显示计时器的时间。
- android:format:一个字符串值,用于设置 Chronometer 显示的时间格式。Android 将使用 %s 来代替显示时间的部分。您可以指定自己想要的时间格式,比如 "MM:SS"(分:秒)或者 "H:MM:SS"(小时:分:秒)。
Chronometer 主要方法
- isCountDown():这个方法用于设置 Chronometer 是否为倒计时模式。如果返回 true,则表示 Chronometer 是倒计时模式,否则表示为计时模式。
- start():该方法用于启动 Chronometer,开始计时或倒计时。一旦调用该方法,Chronometer 将开始更新显示时间。
- stop():该方法用于停止 Chronometer。一旦调用该方法,Chronometer 将停止更新显示时间,当前的时间将保持不变。
范例: 完整的计时器
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:app="http://schemas.android.com/apk/res-auto"android:orientation="vertical"android:gravity="center"><Chronometerandroid:id="@+id/chronometer"android:layout_width="fill_parent"android:layout_height="wrap_content"android:gravity="center"android:textColor="#ff0000"android:textSize="60dip" /><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_margin="10dip"android:orientation="horizontal"><Buttonandroid:id="@+id/btnStart"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1"android:text="开始记时" /><Buttonandroid:id="@+id/btnStop"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1"android:text="停止记时" /><Buttonandroid:id="@+id/btnReset"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1"android:text="重置" /><Buttonandroid:id="@+id/btn_format"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="格式化" /></LinearLayout>
</LinearLayout>
package com.example.myapplication;import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.Button;
import android.widget.Chronometer;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private Chronometer chronometer;private Button startButton, stopButton, resetButton, formatButton;private boolean isRunning = false;private boolean isFormatChanged = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);chronometer = findViewById(R.id.chronometer);startButton = findViewById(R.id.btnStart);stopButton = findViewById(R.id.btnStop);resetButton = findViewById(R.id.btnReset);formatButton = findViewById(R.id.btn_format);startButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {startChronometer();}});stopButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {stopChronometer();}});resetButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {resetChronometer();}});formatButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {changeChronometerFormat();}});}private void startChronometer() {if (!isRunning) {chronometer.setBase(SystemClock.elapsedRealtime());chronometer.start();isRunning = true;}}private void stopChronometer() {if (isRunning) {chronometer.stop();isRunning = false;}}private void resetChronometer() {chronometer.stop();chronometer.setBase(SystemClock.elapsedRealtime());isRunning = false;}private void changeChronometerFormat() {if (!isFormatChanged) {// 第一次点击,更改格式为 "时间:%s"chronometer.setFormat("时间:%s");isFormatChanged = true;} else {// 再次点击,恢复到原始格式chronometer.setFormat("%s");isFormatChanged = false;}}
}
范例: 倒计时
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center"><Chronometerandroid:id="@+id/chronometer"android:layout_width="fill_parent"android:layout_height="wrap_content"android:gravity="center"android:countDown="true"android:textColor="#ff0000"android:textSize="60dip" /><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_margin="10dip"android:orientation="horizontal"><Buttonandroid:id="@+id/btnStart"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1"android:text="开始" /><Buttonandroid:id="@+id/btnReset"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1"android:text="重置" /></LinearLayout></LinearLayout>
package com.example.myapplication;import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.widget.Button;
import android.widget.Chronometer;public class MainActivity extends Activity {private Chronometer chronometer;private Button btnStart;private Button btnReset;private CountDownTimer countDownTimer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);chronometer = findViewById(R.id.chronometer);btnStart = findViewById(R.id.btnStart);btnReset = findViewById(R.id.btnReset);btnStart.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {startCountdown();}});btnReset.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {resetChronometer();}});}private void startCountdown() {countDownTimer = new CountDownTimer(11000, 1000) {@Overridepublic void onTick(long millisUntilFinished) {long secondsRemaining = millisUntilFinished / 1000;chronometer.setText(String.valueOf(secondsRemaining));}@Overridepublic void onFinish() {chronometer.setText("0");showTimeUpDialog();}}.start();}private void resetChronometer() {if (countDownTimer != null) {countDownTimer.cancel();}chronometer.setText("");}private void showTimeUpDialog() {AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setMessage("时间到了!").setPositiveButton("确定", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int id) {// 点击确定按钮后的操作}});builder.create().show();}
}
相关文章:
学习Android的第十三天
目录 Android TextClock 文本时钟控件 TextClock 控件主要属性和方法 简单的 TextClock 参考文档 Android AnalogClock 控件 AnalogClock 属性 Android Chronometer 计时器 Chronometer 属性 Chronometer 主要方法 范例: 完整的计时器 范例: …...
【开源】SpringBoot框架开发学校热点新闻推送系统
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 新闻类型模块2.2 新闻档案模块2.3 新闻留言模块2.4 新闻评论模块2.5 新闻收藏模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 新闻类型表3.2.2 新闻表3.2.3 新闻留言表3.2.4 新闻评论表3.2.5 新闻收藏表 四、系统展…...
代码随想录刷题笔记 DAY 28 | 复原 IP 地址 No.93 | 子集 No.78 | 子集 II No.90
文章目录 Day 2801. 复原 IP 地址(No. 93)1.1 题目1.2 笔记1.3 代码 02. 子集(No. 78)2.1 题目2.2 笔记2.3 代码 03. 子集 II(No. 90)3.1 题目3.2 笔记3.3 代码 Day 28 01. 复原 IP 地址(No. 9…...
LeetCode LCR 085. 括号生成
题目链接https://leetcode.cn/problems/IDBivT/description/ 正整数 n 代表生成括号的对数,请设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 class Solution {public List<String> generateParenthesis(int n) {List<String>…...
django定时任务(django-crontab)
目录 一:安装django-crontab: 二:添加django_crontab到你的INSTALLED_APPS设置: 三:运行crontab命令来创建或更新cron作业: 四:定义你的cron作业 五:创建你的管理命令ÿ…...
【教3妹学编程-算法题】输入单词需要的最少按键次数 II
2哥 : 叮铃铃,3妹,准备复工了啊,过年干嘛呢,是不是逛吃逛吃,有没有长胖呢。 3妹:切,不想上班,假期能不能重来一遍啊,虽然在家我妈张罗着要给我相亲呢。可是在家还是很好的…...
突破编程_C++_高级教程(多线程编程实例)
1 生产者-消费者模型 生产者-消费者模型是一种多线程协作的设计模式,它主要用于处理生产数据和消费数据的过程。在这个模型中,存在两类线程:生产者线程和消费者线程。生产者线程负责生产数据,并将其放入一个共享的数据缓冲区&…...
精读《Function Component 入门》
1. 引言 如果你在使用 React 16,可以尝试 Function Component 风格,享受更大的灵活性。但在尝试之前,最好先阅读本文,对 Function Component 的思维模式有一个初步认识,防止因思维模式不同步造成的困扰。 2. 精读 什…...
类的构造方法
在类中,出成员方法外,还存在一种特殊类型的方法,那就是构造方法。构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的。每个类实例化一个对象时,类都会自动调用构造方法。 构造方法的特点: 构…...
ChatGPT和LLM
ChatGPT和LLM(大型语言模型)之间存在密切的关系。 首先,LLM是一个更为抽象的概念,它包含了各种自然语言处理任务中使用的各种深度学习模型结构。这些模型通过建立深层神经网络,根据已有的大量文本数据进行文本自动生成…...
「优选算法刷题」:判定字符是否唯一
一、题目 实现一个算法,确定一个字符串 s 的所有字符是否全都不同。 示例 1: 输入: s "leetcode" 输出: false 示例 2: 输入: s "abc" 输出: true限制: 0 < len(s) < 100 s[i]仅包含小写字母 二…...
详解自定义类型:枚举与联合体!
目录 编辑 一、枚举类型 1.枚举类型的声明 2.枚举类型的优点 3.枚举类型的使用 二、联合体类型(共用体) 1.联合体类型的声明 2.联合体的特点 3.相同成员的结构体和联合体的对比 4.联合体大小的计算 5.用联合体判断大小端 三.完结散花 悟已往之不谏&…...
第13章 网络 Page738~741 13.8.3 TCP/UDP简述
libcurl是C语言写成的网络编程工具库,asio是C写的网络编程的基础类型库 libcurl只用于客户端,asio既可以写客户端,也可以写服务端 libcurl实现了HTTP\FTP等应用层协议,但asio却只实现了传输层TCP/UDP等协议。 在学习http时介绍…...
Tomcat要点总结
一、Tomcat 服务中部署 WEB 应用 1.什么是Web应用 (1) WEB 应用是多个 web 资源的集合。简单的说,可以把 web 应用理解为硬盘上的一个目录, 这个目录用于管理多个 web 资源。 (2)Web 应用通常也称之为…...
Ubuntu 20.04 安装RVM
RVM是管理Ruby版本的工具,使用RVM可以在单机上方便地管理多个Ruby版本。 下载安装脚本 首先使下载安装脚本 wget https://raw.githubusercontent.com/rvm/rvm/master/binscripts/rvm-installer 如果出现了 Connection refused 的情况, 可以考虑执行以下命令修改dns,再执…...
Ps:污点修复画笔工具
污点修复画笔工具 Spot Healing Brush Tool专门用于快速清除图像中的小瑕疵、污点、尘埃或其他不想要的小元素。 它通过分析被修复区域周围的内容,无需手动取样,自动选择最佳的修复区域来覆盖和融合这些不完美之处,从而实现无痕修复的效果。 …...
JAVA面试题17
什么是Java中的静态内部类?它与非静态内部类有什么区别? 答案:静态内部类是定义在另一个类中的类,并且被声明为静态。与非静态内部类不同,静态内部类不依赖于外部类的实例,可以直接访问外部类的静态成员。 …...
数据备份和恢复
数据备份和恢复 什么情况下会用到数据备份呢 数据丢失的场景 人为误操作造成的某些数据被误操作 软件BUG造成数据部分或者全部丢失 硬件故障造成数据库部分或全部丢失 安全漏洞被入侵数据恶意破坏 非数据丢失场景 基于某个时间点的数据恢复 开发测试环境数据库搭建 相同数据库的…...
核心篇 - 集成IS-IS配置实战
文章目录 一. 实验专题1.1. 实验1:配置单区域集成IS-IS1.1.1. 实验目的1.1.2. 实验拓扑1.1.3. 实验步骤(1)配置IP地址(2)配置IS-IS 1.1.4. 实验调试(1)查看邻接表(2)查看…...
【OpenAI Sora】开启未来:视频生成模型作为终极世界模拟器的突破之旅
这份技术报告主要关注两个方面:(1)我们的方法将各种类型的视觉数据转化为统一的表示形式,从而实现了大规模生成模型的训练;(2)对Sora的能力和局限性进行了定性评估。报告中不包含模型和实现细节…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
UE5 音效系统
一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类,将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix,将上述三个类翻入其中,通过它管理每个音乐…...
python打卡day47
昨天代码中注意力热图的部分顺移至今天 知识点回顾: 热力图 作业:对比不同卷积层热图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import D…...
RabbitMQ work模型
Work 模型是 RabbitMQ 最基础的消息处理模式,核心思想是 多个消费者竞争消费同一个队列中的消息,适用于任务分发和负载均衡场景。同一个消息只会被一个消费者处理。 当一个消息队列绑定了多个消费者,每个消息消费的个数都是平摊的&a…...
