「Mac畅玩鸿蒙与硬件39」UI互动应用篇16 - 倒计时环形进度条

简介: 本篇将带你实现一个倒计时环形进度条应用。用户可以设置倒计时的时间,启动倒计时后,应用会动态显示一个随着时间递减的环形进度条,同时伴有数字倒计时显示。这是结合动画效果和时间管理的实用示例。

本篇将带你实现一个倒计时环形进度条应用。用户可以设置倒计时的时间,启动倒计时后,应用会动态显示一个随着时间递减的环形进度条,同时伴有数字倒计时显示。这是结合动画效果和时间管理的实用示例。

20241130_205809.gif


关键词
  • UI互动应用
  • 倒计时器
  • 环形进度条
  • 动画效果
  • 状态管理

一、功能说明

倒计时环形进度条允许用户设置一个初始倒计时时间,并以环形进度条和数字的方式动态显示剩余时间。倒计时结束时,环形进度条归零并显示“时间到”提示。


二、所需组件

  • @Entry@Component 装饰器
  • Canvas 组件用于绘制环形进度条
  • TextInput 组件用于用户输入倒计时时间
  • Text 组件用于显示倒计时剩余时间
  • Button 组件用于控制倒计时
  • 定时器函数 setIntervalclearInterval 用于时间管理
  • @State 修饰符用于状态管理

三、项目结构

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

四、代码实现

@Entry
@Component
export struct CountdownProgress {
   
  @State remainingTime: number = 10; // 剩余时间(默认10秒)
  @State totalTime: number = 10; // 总时间(倒计时时间)
  @State isRunning: boolean = false; // 是否正在倒计时
  private intervalId: number | null = null; // 定时器ID

  build() {
   
    Column({
    space: 20 }) {
    // 创建垂直布局容器
      // 设置倒计时的时间滑动条
      Text('设置倒计时时间(秒)')
        .fontSize(18)
        .fontWeight(FontWeight.Medium)
        .textAlign(TextAlign.Center);

      // 滑动条,调整倒计时时间
      Slider({
   
        value: this.remainingTime,
        min: 0,
        max: 60,
      })
        .blockColor(Color.Blue) // 设置滑块颜色
        .trackColor(Color.Gray) // 设置轨道颜色
        .onChange((newValue) => {
   
          this.remainingTime = newValue;
          this.totalTime = newValue; // 更新总时间
        })
        .width('80%')
        .margin({
    top: 10 });

      // 显示倒计时的剩余时间
      Text(`${
     this.remainingTime}秒`)
        .fontSize(24)
        .fontWeight(FontWeight.Bold)
        .textAlign(TextAlign.Center)
        .margin({
    top: 20 });

      // 环形进度条显示倒计时进度
      Progress({
   
        value: (this.remainingTime / this.totalTime) * 100, // 设置进度
        total: 100, // 最大进度为100
        type: ProgressType.Ring, // 使用环形进度条
      })
        .color(Color.Green)
        .backgroundColor(Color.Gray)
        .width(200)
        .height(200)
        .margin({
    top: 20 });

      // 开始或停止倒计时按钮
      Button(this.isRunning ? '停止倒计时' : '开始倒计时')
        .onClick(() => {
   
          if (this.isRunning) {
   
            this.stopCountdown();
          } else {
   
            this.startCountdown();
          }
        })
        .fontSize(20)
        .backgroundColor(this.isRunning ? Color.Red : Color.Green)
        .fontColor(Color.White)
        .width('60%')
        .alignSelf(ItemAlign.Center);
    }
    .padding(20)
    .width('100%')
    .height('100%')
    .alignItems(HorizontalAlign.Center);
  }

  // 开始倒计时的方法
  private startCountdown() {
   
    this.isRunning = true;
    this.intervalId = setInterval(() => {
   
      if (this.remainingTime > 0) {
   
        this.remainingTime--;
      } else {
   
        this.stopCountdown();
        this.showTimeUp();
      }
    }, 1000); // 每秒更新一次
  }

  // 停止倒计时的方法
  private stopCountdown() {
   
    this.isRunning = false;
    if (this.intervalId !== null) {
   
      clearInterval(this.intervalId);
      this.intervalId = null;
    }
  }

  // 显示倒计时结束信息
  private showTimeUp() {
   
    // 可以添加一个提示框来显示倒计时结束
    console.log("时间到!"); // 这里是控制台输出,实际可以使用弹窗或者其他UI组件
  }
}
// 文件名:Index.ets

import {
    CountdownProgress } from './CountdownProgress';

@Entry
@Component
struct Index {
   
  build() {
   
    Column() {
   
      CountdownProgress() // 调用倒计时进度条组件
    }
    .padding(20)
  }
}

效果示例:用户设置倒计时时间后,启动倒计时环形进度条逐渐递减,伴随数字显示时间的变化。当时间归零时,环形进度条完全消失。

20241130_205809.gif


五、代码解读

  • Canvas 动态绘图:使用 Canvas 绘制圆形背景和环形进度条,通过实时更新进度条角度实现动态效果。
  • 倒计时逻辑:使用 setInterval 定时减少 timeLeft,实现倒计时功能。
  • 状态管理:通过 @State 实时更新倒计时状态,并联动更新画布内容。

六、优化建议

  1. 颜色渐变:为进度条添加动态颜色变化效果,提高视觉效果。
  2. 音效提醒:倒计时结束时播放提示音,增强用户体验。
  3. 动态文本显示:在环形进度条内实时显示剩余时间,减少用户视线移动。

七、相关知识点


小结

本篇教程通过倒计时环形进度条的实现,展示了 Canvas 绘图与时间控制的结合应用,强化了动态 UI 和交互设计能力。该应用具有直观的时间显示方式,是计时类应用的理想示例。


下一篇预告

在下一篇「UI互动应用篇17 - 照片墙布局」中,我们将探索如何创建一个动态照片墙,展示图片的瀑布流布局效果。


上一篇: 「Mac畅玩鸿蒙与硬件38」UI互动应用篇15 - 猜数字增强版

下一篇: 「Mac畅玩鸿蒙与硬件40」UI互动应用篇17 - 照片墙布局


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


目录
相关文章
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
796 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
人工智能 自然语言处理 API
用自然语言控制电脑,字节跳动开源 UI-TARS 的桌面版应用!内附详细的安装和配置教程
UI-TARS Desktop 是一款基于视觉语言模型的 GUI 代理应用,支持通过自然语言控制电脑操作,提供跨平台支持、实时反馈和精准的鼠标键盘控制。
4531 17
用自然语言控制电脑,字节跳动开源 UI-TARS 的桌面版应用!内附详细的安装和配置教程
|
UED
「Mac畅玩鸿蒙与硬件52」UI互动应用篇29 - 模拟火车票查询系统
本篇教程将实现一个模拟火车票查询系统,通过输入条件筛选车次信息,并展示动态筛选结果,学习事件处理、状态管理和界面展示的综合开发技巧。
371 13
「Mac畅玩鸿蒙与硬件52」UI互动应用篇29 - 模拟火车票查询系统
「Mac畅玩鸿蒙与硬件53」UI互动应用篇30 - 打卡提醒小应用
本篇教程将实现一个打卡提醒小应用,通过用户输入时间进行提醒设置,并展示实时提醒状态,实现提醒设置和取消等功能。
340 10
「Mac畅玩鸿蒙与硬件53」UI互动应用篇30 - 打卡提醒小应用
|
9月前
|
开发框架 前端开发 JavaScript
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发一
本文介绍了方舟开发框架(ArkUI)及其两种开发范式:基于ArkTS的声明式开发范式和类Web开发范式。ArkUI是用于构建HarmonyOS应用界面的UI框架,提供极简UI语法和基础设施。声明式开发范式使用ArkTS语言,以组件、动画和状态管理为核心,适合复杂团队协作;类Web开发范式采用HML、CSS、JavaScript三段式开发,适用于简单界面应用,贴近Web开发者习惯。文中还概述了两者的架构和基础能力,帮助开发者选择合适的范式进行高效开发。
311 15
|
9月前
|
编解码 前端开发 Java
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发三
本文介绍了基于声明式UI范式的图形绘制与动画效果实现方法,涵盖绘制图形、添加动画效果及常见组件说明三部分内容。在绘制图形部分,详细讲解了如何通过Circle组件为食物成分表添加圆形标签,以及使用Path组件结合SVG命令绘制自定义图形(如应用Logo)。动画效果部分则展示了如何利用animateTo实现闪屏动画,包括渐出、放大效果,并设置页面跳转;同时介绍了页面间共享元素转场动画的实现方式。最后,文章列举了声明式开发范式中的各类组件及其功能,帮助开发者快速上手构建复杂交互页面。
347 11
|
5月前
|
存储 开发者 容器
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
本文介绍了ArkTS语言中的Class类、泛型、接口、模块化、自定义组件及状态管理等核心概念,并结合代码示例讲解了对象属性、构造方法、继承、静态成员、访问修饰符等内容,同时涵盖了路由管理、生命周期和Stage模型等应用开发关键知识点。
462 1
鸿蒙 HarmonyOS NEXT星河版APP应用开发-ArkTS面向对象及组件化UI开发使用实例
|
8月前
|
JavaScript 前端开发 UED
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发四
本文介绍了Web组件开发与性能优化的相关内容。在Web组件开发部分,涵盖创建组件、设置样式与属性、添加事件和方法以及场景示例,如动态播放视频。性能提升方面,推荐使用数据懒加载、条件渲染替代显隐控制、Column/Row替代Flex、设置List组件宽高及调整cachedCount减少滑动白块等方法,以优化应用性能与用户体验。
301 56
|
8月前
|
编解码 UED 开发者
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发之常见布局
本文主要介绍了自适应布局与响应式布局的相关内容。自适应布局部分涵盖线性布局、层叠布局、弹性布局和网格布局,详细说明了各布局的特性及使用方法,例如线性布局中的排列、拉伸与缩放,弹性布局的方向、换行与对齐方式等。响应式布局则重点讲解了栅格系统和媒体查询,阐述如何通过栅格组件和媒体查询条件实现不同设备上的适配效果。这些技术帮助开发者灵活应对多尺寸屏幕的设计需求,提升用户体验。
444 55
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。