「Mac畅玩鸿蒙与硬件26」UI互动应用篇3 - 倒计时和提醒功能实现

本篇将带领你实现一个倒计时和提醒功能的应用,用户可以设置倒计时时间并开始计时。当倒计时结束时,应用会显示提醒。该项目涉及时间控制、状态管理和用户交互,是学习鸿蒙应用开发的绝佳实践项目。


关键词
  • UI互动应用
  • 倒计时器
  • 状态管理
  • 用户交互

一、功能说明

在这个倒计时应用中,用户可以设置倒计时的初始时间,点击按钮启动倒计时,并在倒计时结束时收到提醒。用户还可以暂停和重置倒计时,并恢复到初始设置的时间。


二、所需组件
  • @Entry@Component 装饰器
  • Text 组件用于显示倒计时
  • Button 组件用于用户交互
  • TextInput 组件用于用户输入倒计时初始时间
  • setIntervalclearInterval 方法用于时间控制
项目结构
  • 项目名称CountdownApp
  • 自定义组件名称CountdownPage
  • 代码文件CountdownPage.etsIndex.ets

三、代码实现
typescript 复制代码
// CountdownPage.ets
@Component
export struct CountdownPage {
  @State timeLeft: number = 0; // 剩余时间
  @State initialTime: number = 0; // 初始时间
  @State isRunning: boolean = false; // 倒计时状态
  private intervalId: number | null = null; // 定时器 ID

  build() {
    Column({ space: 20 }) {
      Row() {
        Text("倒计时:")
          .fontSize(25)
          .fontWeight(FontWeight.Bold);
        Text(this.formatTime(this.timeLeft))
          .fontSize(25)
          .fontColor(Color.Red);
      }

      // 输入初始时间
      TextInput({ placeholder: "设置倒计时时间(秒)" })
        .type(InputType.Number)
        .onChange((value: string) => {
          if (!this.isRunning) {
            this.initialTime = parseInt(value) || 0;
            this.timeLeft = this.initialTime; // 更新剩余时间
          }
        });

      // 按钮交互行
      Row({ space: 20 }) {
        Button(this.isRunning ? '暂停' : '开始')
          .onClick(() => {
            if (this.isRunning) {
              this.stopCountdown();
            } else {
              this.startCountdown();
            }
          });

        Button('重置')
          .onClick(() => {
            this.resetCountdown();
          });
      }
      .justifyContent(FlexAlign.Center);

      // 提示倒计时结束
      if (this.timeLeft === 0 && this.isRunning) {
        Text("时间到!")
          .fontSize(30)
          .fontColor(Color.Green)
          .fontWeight(FontWeight.Bold);
      }
    }
    .padding(20)
    .height('100%')
    .width('100%')
    .alignItems(HorizontalAlign.Center);
  }

  private startCountdown() {
    if (this.timeLeft > 0) {
      this.isRunning = true;
      this.intervalId = setInterval(() => {
        if (this.timeLeft > 1) {
          this.timeLeft -= 1;
        } else {
          this.stopCountdown();
        }
      }, 1000);
    }
  }

  private stopCountdown() {
    this.isRunning = false;
    if (this.intervalId !== null) {
      clearInterval(this.intervalId);
      this.intervalId = null;
    }
  }

  private resetCountdown() {
    this.stopCountdown();
    this.timeLeft = this.initialTime; // 将倒计时重置为初始时间
  }

  private formatTime(time: number): string {
    return `${Math.floor(time / 60).toString().padStart(2, '0')}:${(time % 60).toString().padStart(2, '0')}`;
  }
}
typescript 复制代码
// Index.ets
import { CountdownPage } from './CountdownPage'

@Entry
@Component
struct Index {
  build() {
    Column() {
      CountdownPage() // 调用自定义组件
    }
    .padding(20) // 设置页面内边距
  }
}

效果示例 :用户输入时间后点击"开始"按钮,倒计时开始;点击"暂停"按钮暂停倒计时;点击"重置"按钮时倒计时恢复到初始设置的时间。


四、代码解读
  • TextInput()
    用于用户输入倒计时的初始时间。输入值会同时更新 initialTimetimeLeft
  • setInterval()clearInterval()
    setInterval() 用于每秒更新 timeLeft,实现倒计时;clearInterval() 用于暂停或重置倒计时。
  • resetCountdown()
    timeLeft 重置为 initialTime,确保倒计时恢复到用户设置的初始值。

五、相关知识点

小结

本篇教程通过实现倒计时和提醒功能,展示了如何在鸿蒙中使用状态管理和时间控制来实现动态更新和用户交互。掌握这些技能后,你将能够更灵活地开发时间管理相关的应用。


下一篇预告

在下一篇「UI互动应用篇4 - 猫与灯的互动应用」中,我们将探索一个有趣的项目,展示如何结合状态和动态图片实现更丰富的用户互动体验。


上一篇: 「Mac畅玩鸿蒙与硬件25」UI互动应用篇2 - 计时器应用实现
下一篇: 「Mac畅玩鸿蒙与硬件27」UI互动应用篇4 - 猫与灯的互动应用

相关推荐
阿图灵5 小时前
Agentic AI 架构入门(九):Agent 通信协议全景——ACP/A2A/AG-UI/MCP
人工智能·ui·架构·ai agent·智能体·mcp·agentic ai
梦想不只是梦与想6 小时前
鸿蒙 测试工具:DevEco Testing(一)
测试工具·harmonyos·testing
大锅盖18 小时前
Web 工单要调用相机,第一步不是打开取景框,而是建立能力门禁
前端·数码相机·harmonyos
AI分享猿10 小时前
UI设计Prompt系列(十二):设计系统入门——把视觉语言沉淀为可复用规范
ui·prompt
l1m0_11 小时前
告别反复修改Prompt:AI生成React应用并落地开发的实战复盘
前端·react.js·ui·ai·设计
IS68311 小时前
视频文案提取技术全景:ASR vs OCR,哪种方案更适合你?
ide·macos·xcode
大千UI工场12 小时前
时序数据库对数字孪生的作用
数据库·ui·时序数据库·前端开发·b端管理系统
贾伟康12 小时前
【华夏二十四节气|07】HarmonyOS 6.0.2(22) ArkTS 节气搜索实战:多字段匹配与四态闭环
移动开发·harmonyos·arkts·arkui·本地搜索
大龄秃头程序员13 小时前
Flutter 项目鸿蒙适配实战:从环境搭建到多环境打包全指南
harmonyos
贾伟康14 小时前
【万能转换器|18】HarmonyOS ArkTS 权限与隐私实战:让 module.json5、功能说明和拒绝路径一致
移动开发·harmonyos·arkts·权限管理·隐私合规