「Mac畅玩鸿蒙与硬件32」UI互动应用篇9 - 番茄钟倒计时应用

简介: 本篇将带你实现一个番茄钟倒计时应用,用户可以设置专注时间和休息时间的时长,点击“开始专注”或“开始休息”按钮启动计时,应用会在倒计时结束时进行提醒。番茄钟应用对于管理时间、提升工作效率非常有帮助,并且还会加入猫咪图片作为界面装饰,让体验更加有趣。

本篇将带你实现一个番茄钟倒计时应用,用户可以设置专注时间和休息时间的时长,点击“开始专注”或“开始休息”按钮启动计时,应用会在倒计时结束时进行提醒。番茄钟应用对于管理时间、提升工作效率非常有帮助,并且还会加入猫咪图片作为界面装饰,让体验更加有趣。

20241106_001626.gif


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

一、功能说明

番茄钟倒计时应用允许用户设置专注时间和休息时间,专注时间用于工作,休息时间用于放松。应用通过倒计时显示当前剩余时间,并在倒计时结束后提醒用户进行下一阶段。界面上还添加了一只猫咪图片作为装饰。


二、所需组件

  • @Entry@Component 装饰器
  • Column 布局组件
  • Image 组件用于显示猫咪图片
  • Text 组件用于显示倒计时和阶段提示
  • Button 组件用于用户交互
  • TextInput 组件用于输入专注和休息时间
  • 定时器函数 setIntervalclearInterval 用于控制倒计时
  • @State 修饰符用于状态管理

项目结构

  • 项目名称PomodoroTimerApp
  • 自定义组件名称PomodoroTimerPage
  • 代码文件PomodoroTimerPage.etsIndex.ets

三、代码实现

// 文件名:PomodoroTimerPage.ets

// 定义番茄钟倒计时页面组件
@Component
export struct PomodoroTimerPage {
   
  @State focusTime: number = 25 * 60; // 默认专注时间为25分钟(单位:秒)
  @State breakTime: number = 5 * 60; // 默认休息时间为5分钟(单位:秒)
  @State timeLeft: number = this.focusTime; // 倒计时时间
  @State isFocusMode: boolean = true; // 当前阶段:专注或休息
  @State isCountingDown: boolean = false; // 倒计时状态
  private timerId: number | null = null; // 定时器 ID

  // 构建页面布局和组件
  build() {
   
    Column({
    space: 20 }) {
    // 创建垂直布局容器,子组件间距为 20
      // 显示猫咪图片
      Image($r('app.media.cat'))
        .width('22%')
        .height('49%')
        .margin({
    bottom: 20 })
        .alignSelf(ItemAlign.Center);

      // 显示当前阶段
      Text(this.isFocusMode ? '专注时间' : '休息时间')
        .fontSize(24)
        .fontWeight(FontWeight.Bold)
        .alignSelf(ItemAlign.Center);

      // 显示倒计时时间
      Text(`剩余时间: ${
     this.formatTime(this.timeLeft)}`)
        .fontSize(20)
        .alignSelf(ItemAlign.Center)
        .fontColor(this.timeLeft > 0 ? Color.Black : Color.Red);

      // 开始倒计时按钮
      Button(this.isCountingDown ? '暂停' : (this.isFocusMode ? '开始专注' : '开始休息'))
        .onClick(() => {
   
          if (this.isCountingDown) {
   
            this.pauseCountdown();
          } else {
   
            this.startCountdown();
          }
        })
        .fontSize(20)
        .backgroundColor(this.isCountingDown ? Color.Red : (this.isFocusMode ? Color.Blue : Color.Green))
        .fontColor(Color.White)
        .margin({
    top: 20 });

      // 重置按钮
      Button('重置')
        .onClick(() => this.resetCountdown())
        .fontSize(20)
        .backgroundColor(Color.Gray)
        .fontColor(Color.White)
        .margin({
    top: 10 });

      // 设置专注时间和休息时间
      Row({
    space: 10 }) {
   
        TextInput({
    placeholder: '设置专注时间(分钟)' })
          .type(InputType.Number)
          .onChange((value: string) => {
   
            this.focusTime = (parseInt(value) || 25) * 60;
            if (this.isFocusMode) {
   
              this.timeLeft = this.focusTime;
            }
          });

        TextInput({
    placeholder: '设置休息时间(分钟)' })
          .type(InputType.Number)
          .onChange((value: string) => {
   
            this.breakTime = (parseInt(value) || 5) * 60;
            if (!this.isFocusMode) {
   
              this.timeLeft = this.breakTime;
            }
          })
      }
      .justifyContent(FlexAlign.Center)
    }
    .padding(20)
    .width('100%')
    .height('100%')
    .alignItems(HorizontalAlign.Center);
  }

  // 格式化倒计时时间
  private formatTime(seconds: number): string {
   
    const minutes = Math.floor(seconds / 60);
    const remainingSeconds = seconds % 60;
    return `${
     minutes.toString().padStart(2, '0')}:${
     remainingSeconds.toString().padStart(2, '0')}`;
  }

  // 开始倒计时的方法
  private startCountdown() {
   
    this.isCountingDown = true;
    this.timerId = setInterval(() => {
   
      if (this.timeLeft > 0) {
   
        this.timeLeft -= 1;
      } else {
   
        this.switchMode(); // 切换到下一个阶段
      }
    }, 1000);
  }

  // 暂停倒计时的方法
  private pauseCountdown() {
   
    this.isCountingDown = false;
    if (this.timerId !== null) {
   
      clearInterval(this.timerId);
      this.timerId = null;
    }
  }

  // 重置倒计时的方法
  private resetCountdown() {
   
    this.pauseCountdown();
    this.timeLeft = this.isFocusMode ? this.focusTime : this.breakTime;
  }

  // 切换专注和休息阶段
  private switchMode() {
   
    this.pauseCountdown();
    this.isFocusMode = !this.isFocusMode;
    this.timeLeft = this.isFocusMode ? this.focusTime : this.breakTime;
  }
}
// 文件名:Index.ets

// 导入番茄钟倒计时页面组件
import {
    PomodoroTimerPage } from './PomodoroTimerPage'

// 定义应用入口组件
@Entry
@Component
struct Index {
   
  build() {
   
    Column() {
   
      PomodoroTimerPage() // 引用番茄钟页面组件
    }
    .padding(20) // 设置页面内边距
  }
}

效果示例:用户可以设置专注和休息时间,点击“开始专注”或“开始休息”按钮后,倒计时将开始,倒计时结束时自动切换到下一个阶段。页面包含猫咪图片装饰,提升用户的使用体验。

20241106_001626.gif


四、代码解读

  • @State timeLeft:保存倒计时剩余时间,倒计时每秒减少 1,当时间为 0 时切换到下一个阶段。
  • @State isFocusMode:用于标识当前是专注模式还是休息模式,每当倒计时结束时切换。
  • startCountdown() 方法:使用 setInterval 启动倒计时,每秒减少 timeLeft 值。
  • pauseCountdown() 方法:暂停倒计时并清除定时器。
  • switchMode() 方法:倒计时结束后切换到下一个阶段,并重新设置 timeLeft 为下一个阶段的时长。

五、优化建议

  1. 增加音效提醒:在每个阶段切换时播放提示音,帮助用户区分工作与休息。
  2. 动画效果:在倒计时减少时添加动画效果,如进度条或颜色变化。
  3. 历史记录:记录每次专注和休息的时长,帮助用户回顾和分析自己的时间使用情况。

六、相关知识点


小结

本篇教程通过番茄钟倒计时应用的实现,展示了如何灵活使用状态管理和定时器控制来实现更复杂的时间管理功能,并结合专注和休息模式切换,帮助用户合理安排时间,提高效率。


下一篇预告

在下一篇「UI互动应用篇10 - 数字猜谜游戏」中,我们将带你实现一个猜数字的游戏,结合随机数生成、用户输入和动态提示信息,实现一个充满乐趣的小项目。


上一篇: 「Mac畅玩鸿蒙与硬件31」UI互动应用篇8 - 自定义评分星级组件

下一篇: 「Mac畅玩鸿蒙与硬件33」UI互动应用篇10 - 数字猜谜游戏


作者:SoraLuna
链接:https://www.nutpi.net/thread?topicId=292
來源:坚果派
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


目录
相关文章
|
5天前
「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台
本篇将带你实现一个虚拟音乐控制台。用户可以通过界面控制音乐的播放、暂停、切换歌曲,并查看当前播放的歌曲信息。页面还支持调整音量和动态显示播放进度,是音乐播放器界面开发的基础功能示例。
147 80
|
7天前
|
数据管理 API 调度
鸿蒙HarmonyOS应用开发 | 探索 HarmonyOS Next-从开发到实战掌握 HarmonyOS Next 的分布式能力
HarmonyOS Next 是华为新一代操作系统,专注于分布式技术的深度应用与生态融合。本文通过技术特点、应用场景及实战案例,全面解析其核心技术架构与开发流程。重点介绍分布式软总线2.0、数据管理、任务调度等升级特性,并提供基于 ArkTS 的原生开发支持。通过开发跨设备协同音乐播放应用,展示分布式能力的实际应用,涵盖项目配置、主界面设计、分布式服务实现及部署调试步骤。此外,深入分析分布式数据同步原理、任务调度优化及常见问题解决方案,帮助开发者掌握 HarmonyOS Next 的核心技术和实战技巧。
129 76
鸿蒙HarmonyOS应用开发 | 探索 HarmonyOS Next-从开发到实战掌握 HarmonyOS Next 的分布式能力
|
8天前
「Mac畅玩鸿蒙与硬件46」UI互动应用篇23 - 自定义天气预报组件
本篇将带你实现一个自定义天气预报组件。用户可以通过选择不同城市来获取相应的天气信息,页面会显示当前城市的天气图标、温度及天气描述。这一功能适合用于动态展示天气信息的小型应用。
102 38
|
7天前
|
开发框架 人工智能 安全
鸿蒙HarmonyOS应用开发 | 「鸿蒙技术分享」HarmonyOS NEXT元服务卡片实战体验
HarmonyOS NEXT的发布对华为及整个行业都产生了深远的影响。它不仅展示了华为的技术实力,还敏锐地把握了市场需求。同时,吸引了更多的开发者和合作伙伴加入鸿蒙生态体系,共同推动鸿蒙生态的繁荣发展。
183 20
鸿蒙HarmonyOS应用开发 | 「鸿蒙技术分享」HarmonyOS NEXT元服务卡片实战体验
|
6天前
|
安全 数据安全/隐私保护 UED
HarmonyOS 5.0 (Next)应用开发实战:使用ArkTS构建开箱即用的登录页面【HarmonyOS 5.0(Next)】
### HarmonyOS 5.0(Next)应用开发实战:使用ArkTS构建开箱即用的登录页面 HarmonyOS 5.0(Next)融合了美学与科技,引入“光感美学”设计理念和多设备深度协同功能。本文通过 ArkTS 构建一个简单的登录页面,展示了模块化导入、状态管理、方法封装、声明式UI构建及事件处理等最佳实践。代码实现了一个包含用户名和密码输入框及登录按钮的界面,支持错误提示和页面跳转。
63 14
HarmonyOS 5.0 (Next)应用开发实战:使用ArkTS构建开箱即用的登录页面【HarmonyOS 5.0(Next)】
|
8天前
|
物联网 调度 vr&ar
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
鸿蒙技术分享:HarmonyOS Next 深度解析 随着万物互联时代的到来,华为发布的 HarmonyOS Next 在技术架构和生态体验上实现了重大升级。本文从技术架构、生态优势和开发实践三方面深入探讨其特点,并通过跨设备笔记应用实战案例,展示其强大的分布式能力和多设备协作功能。核心亮点包括新一代微内核架构、统一开发语言 ArkTS 和多模态交互支持。开发者可借助 DevEco Studio 4.0 快速上手,体验高效、灵活的开发过程。 239个字符
159 13
鸿蒙HarmonyOS应用开发 |鸿蒙技术分享HarmonyOS Next 深度解析:分布式能力与跨设备协作实战
|
6天前
|
自然语言处理 搜索推荐 数据安全/隐私保护
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
鸿蒙登录页面设计展示了 HarmonyOS 5.0(Next)的未来美学理念,结合科技与艺术,为用户带来视觉盛宴。该页面使用 ArkTS 开发,支持个性化定制和无缝智能设备连接。代码解析涵盖了声明式 UI、状态管理、事件处理及路由导航等关键概念,帮助开发者快速上手 HarmonyOS 应用开发。通过这段代码,开发者可以了解如何构建交互式界面并实现跨设备协同工作,推动智能生态的发展。
75 10
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
|
6天前
|
人工智能 安全 数据安全/隐私保护
HarmonyOS应用开发实战:基于ArkTS的开箱即用登录页面实现【样式方式实现①】【HarmonyOS 5.0(Next)】
本文介绍了基于HarmonyOS 5.0(Next)和ArkTS实现的开箱即用登录页面。HarmonyOS 5.0是华为于2024年10月22日发布的第三代移动操作系统,具备原生智能、互联、安全及流畅特性。文章详细解析了使用ArkTS开发登录页面的代码,涵盖组件定义、界面布局、事件处理、样式设置及异步操作等内容,展示了清晰的组件结构、响应式设计与模块化编程的优势。通过这段代码,开发者可以快速上手并构建高效、美观的应用界面。
100 9
|
4天前
|
安全
【HarmonyOS学习】应用文件访问
访问和管理应用文件,对于每个应用,系统会在内部存储空间映射出一个专属的应用沙箱目录,是应用文件目录与一部分系统文件所在的目录组成的集合。也就是应用可见的目录范围即为“应用沙箱目录”。 优点: * 隔离性:应用沙箱提供了一个完全隔离的环境,使用户可以安全地访问应用文件。 * 安全性:应用沙箱限制了应用可见地数据地最小范围,保护了应用文件地安全。
23 5
|
4天前
|
API UED 开发者
鸿蒙应用 VoIP 通话管理模块使用分享
最近老板突然提出需求,希望用户能在应用中发起语音或视频通话,并支持来电提醒、挂断、静音等功能。虽然任务复杂,但可以利用鸿蒙的voipCall模块实现这些需求。该模块提供VoIP通话管理功能,包括上报来电状态、管理通话状态及处理用户交互事件。通过导入`@kit.CallKit`并使用相关API,可以轻松实现语音和视频通话、来电提醒、静音、扬声器等操作。示例代码展示了如何处理来电和音频事件,确保用户获得流畅可靠的通话体验。希望这篇文章能帮大家避免踩坑,有需要的同学可以收藏、点赞。
20 0