学习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的能力和局限性进行了定性评估。报告中不包含模型和实现细节…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
