「Mac畅玩鸿蒙与硬件53」UI互动应用篇30 - 打卡提醒小应用

简介: 本篇教程将实现一个打卡提醒小应用,通过用户输入时间进行提醒设置,并展示实时提醒状态,实现提醒设置和取消等功能。

本篇教程将实现一个打卡提醒小应用,通过用户输入时间进行提醒设置,并展示实时提醒状态,实现提醒设置和取消等功能。

20250103_203702.gif


关键词
  • 打卡提醒
  • 状态管理
  • 定时任务
  • 输入校验
  • UI交互

一、功能说明

打卡提醒小应用包含以下功能:

  1. 提醒时间输入与设置:支持输入格式化时间并进行提醒设置。
  2. 提醒触发与状态提示:在设定时间到达时触发提醒通知。
  3. 取消提醒:支持用户取消已设置的提醒。
  4. 图片装饰:通过图片展示提升界面趣味性。

二、所需组件

  • @Entry@Component 装饰器
  • TextInputButton 组件用于用户输入和操作
  • Text 组件用于展示提醒状态
  • Image 组件用于装饰界面
  • @State 修饰符用于状态管理

三、项目结构

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

四、代码实现

1. 打卡提醒页面代码
// 文件名:ReminderPage.ets

@Component
export struct ReminderPage {
   
  @State reminderTime: string = ''; // 提醒时间输入
  @State reminderStatus: string = '未设置提醒'; // 提醒状态
  private timerId: number | null = null; // 定时器ID

  // 设置提醒
  setReminder(): void {
   
    if (!this.reminderTime.includes(':')) {
   
      this.reminderStatus = '请输入正确格式的时间 (HH:mm)';
      return;
    }

    const timeParts = this.reminderTime.split(':');
    if (timeParts.length !== 2) {
   
      this.reminderStatus = '时间格式错误,请使用 HH:mm 格式';
      return;
    }

    const hours = parseInt(timeParts[0], 10);
    const minutes = parseInt(timeParts[1], 10);

    if (isNaN(hours) || isNaN(minutes) || hours < 0 || hours >= 24 || minutes < 0 || minutes >= 60) {
   
      this.reminderStatus = '时间值不合法,请检查输入';
      return;
    }

    const now = new Date();
    const targetTime = new Date();
    targetTime.setHours(hours, minutes, 0, 0);

    const delay = targetTime.getTime() - now.getTime();
    if (delay <= 0) {
   
      this.reminderStatus = '提醒时间已过,请设置未来时间';
      return;
    }

    this.reminderStatus = `提醒已设置,时间:${
     this.reminderTime}`;
    this.timerId = setTimeout(() => {
   
      this.showNotification();
    }, delay);
  }

  // 提醒触发
  showNotification(): void {
   
    this.reminderStatus = '时间到!请打卡';
  }

  // 取消提醒
  cancelReminder(): void {
   
    if (this.timerId !== null) {
   
      clearTimeout(this.timerId);
      this.timerId = null;
    }
    this.reminderStatus = '提醒已取消';
  }

  build(): void {
   
    Column({
    space: 20 }) {
   
      Text('打卡提醒小应用')
        .fontSize(24)
        .fontWeight(FontWeight.Bold)
        .alignSelf(ItemAlign.Center);

      // 输入提醒时间
      Row({
    space: 10 }) {
   
        TextInput({
   
          placeholder: '请输入提醒时间 (HH:mm)',
          text: this.reminderTime,
        }).width(200)
          .onChange((value: string) => (this.reminderTime = value));

        Button('设置提醒')
          .onClick(() => this.setReminder())
          .width(120)
          .height(40);

        Button('取消提醒')
          .onClick(() => this.cancelReminder())
          .width(120)
          .height(40);
      }
      .alignSelf(ItemAlign.Center);

      // 提醒状态展示
      Text(`当前状态:${
     this.reminderStatus}`)
        .fontSize(18)
        .margin({
    top: 20 });

      // 添加图片装饰
      Image($r('app.media.cat'))
        .width(305)
        .height(360)
        .alignSelf(ItemAlign.Center);
    }
    .padding(20)
    .width('100%')
    .height('100%');
  }
}

2. 主入口文件
// 文件名:Index.ets

import {
    ReminderPage } from './ReminderPage';

@Entry
@Component
struct Index {
   
  build() {
   
    Column() {
   
      ReminderPage() // 调用提醒页面
    }
    .padding(20);
  }
}

效果示例:用户可以输入提醒时间,并在设定时间到达时收到提醒通知。

效果展示
20250103_203702.gif


五、代码解读

  1. 时间输入校验与解析

    • 提醒时间通过 TextInput 输入,并使用 split 拆分成小时和分钟,通过 parseInt 分别解析为整数。
  2. 状态更新与定时任务

    • 使用 setTimeout 设置定时任务,到达提醒时间时更新状态提示用户打卡。
  3. 取消提醒功能

    • 提供“取消提醒”按钮,通过 clearTimeout 取消定时任务,并更新提醒状态。
  4. 图片装饰

    • 使用 Image 组件展示 cat.png 图片,提升界面趣味性和视觉效果。

六、优化建议

  1. 添加周期性提醒功能,例如每日固定时间提醒。
  2. 增加提醒提示音,增强提醒效果。
  3. 提供提醒历史记录,便于用户查看过往提醒信息。

七、效果展示

  • 提醒设置与取消:用户可输入提醒时间并取消提醒。
  • 状态更新:界面实时更新提醒状态并提供反馈。
  • 图片装饰:增加趣味性装饰图片,提升界面交互体验。

八、相关知识点


小结

本篇教程展示了如何使用状态管理和定时任务,实现一个简单的打卡提醒小应用,学习了输入校验、界面状态更新和用户交互的基本开发方法。


下一篇预告

在下一篇「UI互动应用篇31 - 滑动解锁屏幕功能」中,将实现滑动解锁功能,通过滑动操作实现屏幕解锁的交互效果。


上一篇: 「Mac畅玩鸿蒙与硬件52」UI互动应用篇29 - 模拟火车票查询系统

下一篇: 「Mac畅玩鸿蒙与硬件54」UI互动应用篇31 - 滑动解锁屏幕功能


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


目录
相关文章
|
4天前
「Mac畅玩鸿蒙与硬件51」UI互动应用篇28 - 模拟记账应用
本篇教程将介绍如何创建一个模拟记账应用,通过账单输入、动态列表展示和实时统计功能,学习接口定义和组件间的数据交互。
106 68
|
3天前
|
UED
「Mac畅玩鸿蒙与硬件52」UI互动应用篇29 - 模拟火车票查询系统
本篇教程将实现一个模拟火车票查询系统,通过输入条件筛选车次信息,并展示动态筛选结果,学习事件处理、状态管理和界面展示的综合开发技巧。
33 13
|
5天前
|
存储 人工智能 JavaScript
Harmony OS开发-ArkTS语言速成二
本文介绍了ArkTS基础语法,包括三种基本数据类型(string、number、boolean)和变量的使用。重点讲解了let、const和var的区别,涵盖作用域、变量提升、重新赋值及初始化等方面。期待与你共同进步!
63 47
Harmony OS开发-ArkTS语言速成二
|
7天前
|
API 索引
鸿蒙开发:实现一个超简单的网格拖拽
实现拖拽,最重要的三个方法就是,打开编辑状态editMode,实现onItemDragStart和onItemDrop,设置拖拽移动动画和交换数据,如果想到开启补位动画,还需要实现supportAnimation方法。
60 13
鸿蒙开发:实现一个超简单的网格拖拽
|
6天前
|
索引
鸿蒙开发:自定义一个股票代码选择键盘
金融类的软件,特别是股票基金类的应用,在查找股票的时候,都会有一个区别于正常键盘的键盘,也就是股票代码键盘,和普通键盘的区别就是,除了常见的数字之外,也有一些常见的股票代码前缀按钮,方便在查找股票的时候,更加方便的进行检索。
鸿蒙开发:自定义一个股票代码选择键盘
|
6天前
鸿蒙开发:自定义一个英文键盘
实现方式呢,有很多种,目前采用了比较简单的一种,如果大家采用网格Grid组件实现方式,也是可以的,但是需要考虑每行的边距以及数据,还有最后两行的格子占位问题。
鸿蒙开发:自定义一个英文键盘
|
7天前
|
存储 JSON 数据库
鸿蒙元服务项目实战:备忘录内容编辑开发
富文本内容编辑我们直接使用RichEditor组件即可,最重要的就是参数,value: RichEditorOptions,通过它,我们可以用来设置样式,和获取最后的富文本内容,这一点是很重要的。
鸿蒙元服务项目实战:备忘录内容编辑开发
|
7天前
|
开发框架 JavaScript 前端开发
Harmony OS开发-ArkT语言速成一
本文介绍ArkTS语言,它是鸿蒙生态的应用开发语言,基于TypeScript,具有静态类型检查、声明式UI、组件化架构、响应式编程等特性,支持跨平台开发和高效性能优化。ArkTS通过强化静态检查和分析,提升代码健壮性和运行性能,适用于Web、移动端和桌面端应用开发。关注我,带你轻松掌握HarmonyOS开发。
29 5
Harmony OS开发-ArkT语言速成一
|
6天前
|
前端开发 API 数据库
鸿蒙开发:异步并发操作
在结合async/await进行使用的时候,有一点需要注意,await关键字必须结合async,这两个是搭配使用的,缺一不可,同步风格在使用的时候,如何获取到错误呢,毕竟没有catch方法,其实,我们可以自己创建try/catch来捕获异常。
鸿蒙开发:异步并发操作
|
7天前
鸿蒙开发:简单了解属性动画
无论是是使用animateTo还是animation,其实最终要改变的都是组件的可执行属性,最终的效果是一致的,animateTo是闭包内改变属性引起的界面变化,一般作用于出现消失转场,而animation则是组件通过属性接口绑定的属性变化引起的界面变化,一般使用场景为,animateTo适用对多个可动画属性配置相同动画参数的动画,需要嵌套使用动画的场景;animation适用于对多个可动画属性配置不同参数动画的场景。

热门文章

最新文章