Android时钟和计时器

本文介绍了Android应用中TextView的子类TextClock和AnalogClock,以及计时器组件Chronometer的功能、用法和XML属性。通过实例展示了如何在应用中实现模拟时钟和数字时钟,并展示了Chronometer的计时和事件监听功能。

第2章 Android 应用的界面编程
2.3 第2组 UI组件:TextView及其子类
2.3.7 时钟(AnalogClock和TextClock)的功能与用法

时钟UI组件是两个非常简单的组件:TextClock本身就继承了TextView-
也就是说,它本身就是文本框,只是它里面显示的内容总是当前时间。与TextView 不同的是,为TextClock 设置android:text属性没什么作用。

TextClock取代早期的 DigitalClock 组件,因此功能更加强大——TextClock能以24小时制或12小时制来显示时间,而且可以由程序员来指定时间格式

TextClock支持的XML属性及相关方法:

在这里插入图片描述

AnalogClock则继承了View组件,它重写了View的OnDraw()方法,它会在View上绘制模拟时钟。

AnalogClock支持的XML属性

在这里插入图片描述

TextClock和 AnalogClock 都会显示当前时间。不同的是,TextClock 显示数字时钟,可以显示当前的秒数; AnalogClock 显示模拟时钟,不会显示当前的秒数。

实例——手机里的“劳力士”

创建新模块

在这里插入图片描述

布局

<?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:gravity="center_horizontal"
    android:orientation="vertical">

    <!--  定义模拟时钟  -->
    <AnalogClock
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <!-- 定义数字时钟  -->
    <TextClock
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:drawableEnd="@mipmap/ic_launcher"
        android:format12Hour="yyyy年MM月dd日 H:mma EEEE"
        android:textColor="#f0f"
        android:textSize="20dp" />

    <!--  定义模拟时钟,并使用自定义表盘、时针图片  -->
    <AnalogClock
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:dial="@drawable/watch"
        android:hand_minute="@drawable/hand" />


</LinearLayout>

直接运行

在这里插入图片描述

2.3.8 计时器(Chronometer)

Android还提供了一个计时器组件:Chronometer,该组件与TextClock都继承自TextView,因此它们都会显示一段文本。但 Chronometer 并不显示当前时间,它显示的是从某个起始时间开始,一共过去了多长时间。

Chronometer的用法也很简单,它只提供了android:format和 android:countDown属性,其中前者用于指定计时器的计时格式。除此之外,Chronometer还支持如下常用方法:

  • setBase(long base):设置计时器的起始时间。
  • setFormat(String format):设置显示时间的格式。
  • start():开始计时。
  • stop():停止计时。
  • setOnChronometerTickListener(Chronometer.OnChronometerTickListener listener):为计时器绑定事件监听器,当计时器改变时触发该监听器。

新建模块

在这里插入图片描述

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal">
    <Chronometer
        android:id="@+id/test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="12pt"
        android:textColor="#ffff0000"/>
    <Button
        android:id="@+id/start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="启动"/>
</LinearLayout>

逻辑代码

package com.dingjiaxiong.chronometertest;

import androidx.appcompat.app.AppCompatActivity;

import android.database.CursorJoiner;
import android.os.Bundle;
import android.os.SystemClock;
import android.widget.Button;
import android.widget.Chronometer;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //获取组件
        Chronometer ch = findViewById(R.id.test);

        //获取按钮
        Button start = findViewById(R.id.start);

        start.setOnClickListener((view) ->{
            //设置开始计时时间
            ch.setBase(SystemClock.elapsedRealtime());
            //启动计时器
            ch.start();
            start.setEnabled(false);
        });

        //为Chronmeter绑定事件监听器
        ch.setOnChronometerTickListener((source) ->{
            //如果从开始计时到现在超过了20s
            if (SystemClock.elapsedRealtime() - ch.getBase() > 5 * 1000){
                ch.stop();
                start.setEnabled(true);
            }
        });

    }
}

运行效果

在这里插入图片描述

转载地址:https://blog.youkuaiyun.com/weixin_44226181/article/details/126458860

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值