ArkTS 任务统计页面

news2024/11/15 9:05:21

我们继续学习使用ArkTS实现一个任务进度的统计功能。

 

1.公共的组件、样式


class Task{
  static id: number = 1
  // 任务名称
  name: string = `任务${Task.id++}`
  // 任务状态: 是否完成
  finished: boolean = false
}

// 统计的卡片样式
@Styles function card(){
  .width('95%')
  .padding(20)
  .backgroundColor(Color.White)
  .borderRadius(15)
  .shadow({radius: 6,color: '#1f0000',offsetX:2,offsetY:4})
}

// 任务完成样式
@Extend(Text) function finishedTask(){
  .decoration({type:TextDecorationType.LineThrough})
  .fontColor('#b1b2b1')
}

@Entry
@Component
struct PropPage {
  // 总任务数量
  @State totalTask: number = 0
  // 已经完成数量
  @State finishTask: number = 0
  // 任务数量
  @State tasks: Task[] = []

  build() {
      Column({space:10}) {

      }
      .width('100%')
      .height('100%')
      .backgroundColor('#f1f2f3')
  }
}

整个Demo主要分为三部分完成,最上边的任务进度卡片、中间的新增按钮和下面的任务进度列表。我们分步骤来完成 

2.任务进度卡片的制作

1.排版

我们使用行标签套两个text标签来完成数字的展示使用justifyContent(FlexAlign.SpaceEvenly)来做对齐处理

        Row(){
          Text("任务进度")
            .fontSize(30)
            .fontWeight(FontWeight.Bold)
          Row(){
            Text(this.finishTask.toString())
              .fontSize(24)
              .fontColor('#36d')
            Text(' / ' +this.totalTask.toString())
              .fontSize(24)
          }
        }
        .card()
          .margin({top:20,bottom:10})
          .justifyContent(FlexAlign.SpaceEvenly)

2.任务条组件

我们在使用进度条组件的时候,可以查看ArkUI的官方文档。

文档中心

文档中有组件的使用方法和传值的类型。

 

3. 叠加容器

我们会发现数字没有嵌入我们的任务条组件内。我们需要用到叠加容器Stack。 

具体文档可以参考ArkTS官方文档。就是把要叠加的容器放在Stack({

}) 中就可以了。

        // 1.任务进度卡片
        Row(){
          Text("任务进度")
            .fontSize(30)
            .fontWeight(FontWeight.Bold)
          Stack(){
            Progress({
              value:this.finishTask,
              total:this.totalTask,
              type:ProgressType.Ring
            })
              .width(100)
            Row(){
              Text(this.finishTask.toString())
                .fontSize(24)
                .fontColor('#36d')
              Text(' / ' +this.totalTask.toString())
                .fontSize(24)
            }
          }
        }

这样我们的任务进度卡片就完成啦。 

2.新增任务按钮的制作

        // 2.新增任务按钮
        Button('新增任务')
          .width(200)
          .onClick(()=>{
            // 1.新增任务
            this.tasks.push(new Task())
            // 2.更新任务数组
            this.totalTask = this.tasks.length
          })

3.任务列表的制作

我们在进行任务列表的制作的时候,需要用到一个复选框,可以参考文档来使用。

文档中心

我们使用foreach来遍历数组完成任务列表的实现,使用checkbox 来完成复选框的逻辑,使用数组方法filter来过滤选中的也就是完成的个数来改变任务条组件的状态。 

通过封装一个更新任务进度的函数,来提高代码的复用性

  // 通过过滤方法 更新已完成的任务数量
  handleTaskChange(){
    // 更新任务总数量
    this.totalTask = this.tasks.length
    // 已经完成的任务数量
    this.finishTask = this.tasks.filter(item => item.finished).length
  }
        // 3.卡片列表
        ForEach(
          this.tasks,
          (item: Task,index)=>{
            Row(){
              Text(item.name)
                .fontSize(20)
              Checkbox()
                .select(item.finished)
                .onChange(val=>{
                  item.finished = val
                  // 通过过滤方法 更新已完成的任务数量
                  this.finishTask = this.tasks.filter(item => item.finished).length
                  this.handleTaskChange()
                })
            }
            .card()
            .justifyContent(FlexAlign.SpaceBetween)
          }
        )

我们的 任务进度管理初步样式就完成了。

 

 4.滑动删除操作的实现

我们的功能需要一个向左滑动可以删除任务的按钮,并且下面应该是滚动的,我们将我们的任务列表改造成List来完成这个操作。

        // 3.卡片列表
        List({space:10}){
          ForEach(
            this.tasks,
            (item: Task,index)=>{
              ListItem(){
                Row(){
                  Text(item.name)
                    .fontSize(20)
                  Checkbox()
                    .select(item.finished)
                    .onChange(val=>{
                      item.finished = val
                      // 通过过滤方法 更新已完成的任务数量
                      this.handleTaskChange()
                    })
                }
                .card()
                .justifyContent(FlexAlign.SpaceBetween)
              }
            }
          )
        }
        .width('100%')
        .layoutWeight(1)
        .alignListItem(ListItemAlign.Center)

使用了list 并且使用layoutWeight属性得到剩下的所有高度,可以保证我们的高度自适应,可以下拉,解决了任务太多看不见的问题。

 向左滑动出现按钮,List有可以直接使用的属性swipeAction,可以查看文档他的使用方法。


class Task{
  static id: number = 1
  // 任务名称
  name: string = `任务${Task.id++}`
  // 任务状态: 是否完成
  finished: boolean = false
}

// 统计的卡片样式
@Styles function card(){
  .width('95%')
  .padding(20)
  .backgroundColor(Color.White)
  .borderRadius(15)
  .shadow({radius: 6,color: '#1f0000',offsetX:2,offsetY:4})
}

// 任务完成样式
@Extend(Text) function finishedTask(){
  .decoration({type:TextDecorationType.LineThrough})
  .fontColor('#b1b2b1')
}

@Entry
@Component
struct PropPage {
  // 总任务数量
  @State totalTask: number = 0
  // 已经完成数量
  @State finishTask: number = 0
  // 任务数量
  @State tasks: Task[] = []

  // 通过过滤方法 更新已完成的任务数量
  handleTaskChange(){
    // 更新任务总数量
    this.totalTask = this.tasks.length
    // 已经完成的任务数量
    this.finishTask = this.tasks.filter(item => item.finished).length
  }
  build() {
      Column({space:10}) {
        // 1.任务进度卡片
        Row(){
          Text("任务进度")
            .fontSize(30)
            .fontWeight(FontWeight.Bold)
          Stack(){
            Progress({
              value:this.finishTask,
              total:this.totalTask,
              type:ProgressType.Ring
            })
              .width(100)
            Row(){
              Text(this.finishTask.toString())
                .fontSize(24)
                .fontColor('#36d')
              Text(' / ' +this.totalTask.toString())
                .fontSize(24)
            }
          }
        }
        .card()
          .margin({top:20,bottom:10})
          .justifyContent(FlexAlign.SpaceEvenly)

        // 2.新增任务按钮
        Button('新增任务')
          .width(200)
          .onClick(()=>{
            // 1.新增任务
            this.tasks.push(new Task())
            // 2.更新任务数组
            this.totalTask = this.tasks.length
          })

        // 3.卡片列表
        List({space:10}){
          ForEach(
            this.tasks,
            (item: Task,index)=>{
              ListItem(){
                Row(){
                  Text(item.name)
                    .fontSize(20)
                  Checkbox()
                    .select(item.finished)
                    .onChange(val=>{
                      item.finished = val
                      // 通过过滤方法 更新已完成的任务数量
                      this.handleTaskChange()
                    })
                }
                .card()
                .justifyContent(FlexAlign.SpaceBetween)
              }
              .swipeAction({end:this.DeleteButton(index)})
            }
          )
        }
        .width('100%')
        .layoutWeight(1)
        .alignListItem(ListItemAlign.Center)
      }
      .width('100%')
      .height('100%')
      .backgroundColor('#f1f2f3')
  }
  @Builder DeleteButton(index: number){
      Button("删除")
        .onClick(()=>{
          this.tasks.splice(index,1)
          this.handleTaskChange()
        })
  }
}

至此,我们的任务统计案例 就学习完了。 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1312738.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c#按照时间进行数据存储(不用数据库)

概要介绍 按照日期生成文件夹,按照时间生成文件名,存储字符串。 可以用于简单数据记录(如果数据存储考虑格式文本,保存为csv格式) 实现效果 调用方法 SaveText.saveStr("测试字符串"DateTime.Now.ToStrin…

LeetCode 2132. 用邮票贴满网格图:二维前缀和 + 二维差分

【LetMeFly】2132.用邮票贴满网格图:二维前缀和 二维差分 力扣题目链接:https://leetcode.cn/problems/stamping-the-grid/ 给你一个 m x n 的二进制矩阵 grid ,每个格子要么为 0 (空)要么为 1 (被占据&…

关于git clone速度极慢的解决方法

!!!!前提条件:得有一个可靠且稳定的梯子,如果没有接下来的就不用看了 前言:我在写这篇文章前,也搜索过很多相关git clone速度很慢的解决方法,但是很多很麻烦&#xff0c…

系统规划与管理师和信息系统项目管理师哪个好考?

软考系统规划与管理师和信息系统项目管理师是软考中备受关注的两个证书。这两个证书的相关知识领域广泛,对于从事IT行业的人们来说,都具有相当的吸引力。那么,对于考生而言,究竟哪个证书更适合呢?接下来,我…

MQTT 介绍与学习 —— 筑梦之路

之前写过的相关文章: MQTT协议(转载)——筑梦之路_mqtt url-CSDN博客 k8s 部署mqtt —— 筑梦之路-CSDN博客 CentOS 7 搭建mqtt服务——筑梦之路_腾讯云宝塔搭 centos 7.9.2009 x86_64 建标准mqtt服务器-CSDN博客 mqtt简介 MQTT&#xff…

NV040D语音芯片应用于取暖桌:智能语音提高用户体验

科技与生活的结合,是科技发展的展示。天气的降温,取暖桌越来越取得用户的心,时至今日传统的取暖桌已经没有办法满足用户的需求,智能语音取暖桌给用户的生活带来了不一样的体验。 NV040D语音芯片是一款性能稳定的芯片,拥…

strtok()的用法及实现哦

1. 用法 1. 声明:char *strtok(char *str, const char *delim) str -- 要被分解成一组小字符串的字符串。第一次调用 strtok() 时,这个参数应该是你想要分割的字符串。随后的调用应该将此参数设置为NULL,以便继续从上次的位置分割。delim -- …

弹性搜索引擎Elasticsearch:本地部署与远程访问指南

🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、Cpolar杂谈 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言系统环境1. Windows 安装Elasticsearch2. 本地访问Elasticsearch3. Windows 安装…

前端常用去重的几种方式

文章目录 方式1: ES6新语法方式2: 遍历 利用filter方式3: 使用 new Map() for循环方式4: 利用 hasOwnProperty总结 在github 查看该文章 方式1: ES6新语法 过滤出网页中不重复的html标签 结合去重知识点考查 […new Set([…document.querySelectorAll(‘*’)].map(v>v.t…

JSON初学习

目录 1、JSON定义 2、与 JS 对象的关系 3、常用类型示例 4、JSON与XML比较 1、JSON定义 JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer Manufacturers Association, 欧…

【AI美图】第01期效果图,AI人工智能无绘画,美图欣赏

人工智能被各大平台传递,我也来凑一下热闹,放一组基础图片展示 介绍一下模型来源Stability AI: Stability AI直接将模型开源,且方式之粗暴,几乎完全不对生成内容做任何审核或者过滤。目前发布的稳定版本仅包含部分关…

YOLOv8优化策略:UniRepLKNetBlock 助力检测 | UniRepLKNet,通用感知大内核卷积网络,2023.12

🚀🚀🚀本文改进: UniRepLKNet,通用感知大内核卷积网络,ImageNet-22K预训练,精度 和速度SOTA,ImageNet达到88%, COCO达到56.4 box AP,ADE20K达到55.6 mIoU UniRepLKNetBlock 与C2f进行结合使用 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学…

上海亚商投顾:沪指高开低走 电力、煤炭板块逆势走强

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 三大指数昨日高开低走,深成指、创业板指盘初涨超1%,随后冲高回落集体翻绿。 国企改革…

Qt图形设计

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//窗口相关设置//设置窗口标题this->setWindowTitle("王者荣耀");//设置窗口图标this->setWindowIcon(QIcon("C:\\Users\\28033\\Pictures\\Saved Pictures\\pict…

学习使用echarts漏斗图的参数配置和应用场景

学习使用echarts漏斗图的参数配置和应用场景 前言什么是漏斗图漏斗图的特点及应用场景漏斗图的特点漏斗图常见的的应用场景: echarts中漏斗的常用属性echart漏斗代码美化漏斗图样式1、设置标题字体大小2、设置标签样式3、设置漏斗图为渐变颜色4、设置高亮效果5、设置…

java导出word使用模版与自定义联合出击解决复杂表格!

1. 看一下需要导出什么样子的表格 如图所示,这里的所有数据行都是动态的,需要根据查询出来的数据循环展示。 如果只是这样的话,使用freemarker应该都可以搞定,但是他一列中内容相同的单元格,需要合并。 这对于表格样式…

Go实现http同步文件操作 - 增删改查

http同步文件操作 - 增删改查 http同步文件操作 - 增删改查1. 前置要求1.1. 构建结构体 文件名 文件内容1.1.1. 页面结构体1.1.2. 为Page结构体绑定方法:Save1.1.3. 对Page结构体支持页面内容查看方法,同时提供页面文件是否存在的方法 1.2. 简单验证上面…

【树莓派】高级开发概述、开发环境搭建(内核镜像拷贝至树莓派并启动新内核)

一、树莓派开发环境搭建 二、Linux文件系统的目录结构 三、树莓派Linux源码目录树分析 四、树莓派Linux源码配置 五、如何配置树莓派的Linux内核 六、树莓派Linux内核编译 七、配置启动参数的cmdline.txt 一、树莓派开发环境搭建 树莓派官网 raspberrypi raspberrypi/tools…

FM30H12G N通道沟槽电源MOS管 封装形式PDFN5*6

FM30H12G 是一款 N通道沟槽电源的场效应管(MOS管),封装形式:PDFN5*6。 来百度APP畅享高清图片 FM30H12G应用: 1、液晶电视 2、笔记本 3、电梯 4、感应加热 5、电动工具

低碳未来,智慧共赢!SIA上海工业自动化展2024焕新出发!

近年来,全球积极推进智能化数字化赋能工程,国内制造业也全面向数字化智能化转型。重点企业、龙头企业充分发挥综合优势,着力推动智能工厂、数字化车间的建设,深入实施“机器换人”战略,以促进产品、企业、产业全面升级…