学习Android的第十三天

目录

[Android TextClock 文本时钟控件](#Android TextClock 文本时钟控件)

[TextClock 控件主要属性和方法](#TextClock 控件主要属性和方法)

[简单的 TextClock](#简单的 TextClock)

参考文档

[Android AnalogClock 控件](#Android AnalogClock 控件)

[AnalogClock 属性](#AnalogClock 属性)

[Android Chronometer 计时器](#Android Chronometer 计时器)

[Chronometer 属性](#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 复制代码
<?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">

        <TextClock
            android: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>

参考文档

  1. 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 复制代码
<?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">

        <Chronometer
            android:id="@+id/chronometer"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:textColor="#ff0000"
            android:textSize="60dip" />

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dip"
            android:orientation="horizontal">

                <Button
                    android:id="@+id/btnStart"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="开始记时" />

                <Button
                    android:id="@+id/btnStop"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="停止记时" />

                <Button
                    android:id="@+id/btnReset"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="重置" />

                <Button
                    android:id="@+id/btn_format"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="格式化" />
        </LinearLayout>
</LinearLayout>
java 复制代码
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;

    @Override
    protected 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() {
            @Override
            public void onClick(View v) {
                startChronometer();
            }
        });

        stopButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stopChronometer();
            }
        });

        resetButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                resetChronometer();
            }
        });

        formatButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public 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 复制代码
<?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">
        <Chronometer
            android: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" />

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dip"
            android:orientation="horizontal">

                <Button
                    android:id="@+id/btnStart"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="开始" />

                <Button
                    android:id="@+id/btnReset"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="重置" />
        </LinearLayout>

</LinearLayout>
java 复制代码
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;

    @Override
    protected 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() {
            @Override
            public void onClick(View v) {
                startCountdown();
            }
        });

        btnReset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                resetChronometer();
            }
        });
    }

    private void startCountdown() {
        countDownTimer = new CountDownTimer(11000, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                long secondsRemaining = millisUntilFinished / 1000;
                chronometer.setText(String.valueOf(secondsRemaining));
            }

            @Override
            public 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();
    }
}
相关推荐
阿巴斯甜10 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker11 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952712 小时前
Andorid Google 登录接入文档
android
黄林晴13 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android