当前位置: 首页 > article >正文

【时间盒子】-【9.任务设置项】自定义任务名称、任务时长等设置项组件

Tips:

@Stage、@Link装饰器的使用;

参考我的帖子:https://developer.huawei.com/consumer/cn/forum/topic/0208152234389094513?fid=0101587866109860105

一、预览

  1. 红色框:任务设置项列表,把它定义为一个组件对象SettingList。
  2. 绿色框:任务设置项,这里有两个设置项,分别是任务名称和任务时长,后续可能有更多的设置项。所以把这些设置项抽象为一个类对象TaskSettingItem,这个对象类有名称(任务名称)、内容(早起跑步)和类型。
  3. 设置项类型:定义一个枚举类型对象TaskSettingType,代表不同的设置项;通过这个类型判断,当点击不同类型的设置项,弹出不同的对话框(见下一篇)。

二、枚举类型TaskSettingType.ets

右击目录constants >> 新建 >> ArkTS File,文件命名为TaskSettingType。

定义两个枚举常量,分别是0表示任务名称TASK_NAME;1表示任务时长TASK_DURATION。代码如下:

/**
 * 任务设置类型
 */
export enum TaskSettingType {
  /**
   * 任务名称
   */
  TASK_NAME = 0,
  /**
   * 任务时长
   */
  TASK_DURATION = 1

}

三、任务设置项TaskSettingItem.ets

右击目录viewmodel >> 新建 >> ArkTS File,文件命名为TaskSettingItem。

给设置项定义三个属性,分别是项的名称、内容和类型。代码如下:

import { TaskSettingType } from '../constants/TaskSettingType';
/**
 * 任务设置项实体对象
 */
export default class TaskSettingItem {
  /**
   * 设置项的标题
   */
  public title: string;

  /**
   * 设置项的值内容
   */
  public content: string;

  /**
   * 设置项的类型
   */
  public sType: TaskSettingType;

  /**
   * 构造函数
   * @param title 设置项的标题
   * @param content 设置项的值内容
   * @param type 设置项的类型
   */
  constructor(title: string, content: string, type: TaskSettingType) {
    this.title = title;
    this.content = content;
    this.sType = type;
  }
}

四、任务设置项列表组件SettingList.ets

右击目录component >> 新建 >> ArkTS File,文件命名为SettingList。

 

  1. 设置项列表使用Column列上下布局,包含多个设置项,设置项与设置项之间有分割线隔开。
  2. 每个设置项使用Row行左右布局,包含设置项的名称、内容和右箭头图片。

给该组件定义一个任务设置项数组对象settingItems: Array<TaskSettingItem>,通过遍历数组对象的元素,动态生成任务设置项。代码如下:

import SizeUtil from '../utils/SizeUtil'
import TaskSettingItem from '../viewmodel/TaskSettingItem'


@Component
export default struct SettingList {
  @Link settingItems: Array<TaskSettingItem>;

  build() {
    Column() {
      ForEach(this.settingItems, (item: TaskSettingItem, index: number | undefined) => {
        // 分割线,第一个不显示
        Divider()
          .visibility(index === 0 ? Visibility.Hidden : Visibility.Visible)
          .opacity($r('app.float.divider_opacity'))
          .color($r('app.color.grey_divider'))
          .lineCap(LineCapStyle.Round)
          .margin({
            left: SizeUtil.getVp($r('app.float.setting_item_divider_margin_horizon')),
            right: SizeUtil.getVp($r('app.float.setting_item_divider_margin_horizon'))
          })

        Row() {
          Text(item.title)
            .fontSize(SizeUtil.getVp($r('app.float.setting_item_name_font_size')))
            .fontWeight(FontWeight.Regular)
            .fontColor($r('app.color.grey_divider'))
            .layoutWeight(1)
          Text(item.content == '' ? '请输入' : item.content)
            .fontSize(SizeUtil.getVp($r('app.float.setting_item_content_font_size')))
            .fontWeight(FontWeight.Normal)
            .fontColor($r('app.color.grey_divider'))
            .opacity($r('app.float.setting_item_content_font_opacity'))
          Image($r('app.media.icon_right'))
            .width(SizeUtil.getVp($r('app.float.setting_item_image_width')))
            .height(SizeUtil.getVp($r('app.float.setting_item_image_height')))
            .objectFit(ImageFit.Fill)
            .margin({
              left: SizeUtil.getVp($r('app.float.setting_item_image_margin_horizon'))
            })
        }
        .height(SizeUtil.getVp($r('app.float.setting_item_height')))
        .alignItems(VerticalAlign.Center)
        .padding({
          left: SizeUtil.getVp($r('app.float.setting_item_interval')),
          right: SizeUtil.getVp($r('app.float.setting_item_interval'))
        })
        .onClick(() => {
          // 弹窗设置
          // TODO:
        })

      }, (item: TaskSettingItem, index: number | undefined) => JSON.stringify(item) + index)
    }
    .margin({
      bottom: SizeUtil.getVp($r('app.float.setting_item_interval')),
      left: SizeUtil.getVp($r('app.float.setting_item_interval')),
      right: SizeUtil.getVp($r('app.float.setting_item_interval'))
    })
    .borderRadius(SizeUtil.getVp($r('app.float.setting_item_border_radius')))
    .backgroundColor(Color.White)
  }

}

五、float.json

在资源文件float中新定义的数值,代码如下:

{
  "name": "divider_opacity",
  "value": "0.05"
},
{
  "name": "setting_item_divider_margin_horizon",
  "value": "12"
},
{
  "name": "setting_item_name_font_size",
  "value": "16"
},
{
  "name": "setting_item_content_font_size",
  "value": "14"
},
{
  "name": "setting_item_content_font_opacity",
  "value": "0.6"
},
{
  "name": "setting_item_image_width",
  "value": "6.7"
},
{
  "name": "setting_item_image_height",
  "value": "12.8"
},
{
  "name": "setting_item_image_margin_horizon",
  "value": "7"
},
{
  "name": "setting_item_height",
  "value": "56"
},
{
  "name": "setting_item_interval",
  "value": "12"
},
{
  "name": "setting_item_border_radius",
  "value": "24"
}

六、资源文件

在资源文件media目录下添加设置项右侧的箭头图片文件(见附件)

 

 

 


http://www.kler.cn/news/338827.html

相关文章:

  • 函数编程:让开发完全专注于代码
  • 深度学习——生成对抗网络(GAN)
  • 多文件并发多线程MD5工具(相对快速的MD5一批文件),适配自定义MD5 Hash I/O缓存。
  • PCL 计算点云的平均曲率
  • win11远程连接MySQL(linux版),不需安装docker容器
  • 什么是变阻器?
  • 超声波清洗机什么品牌洗眼镜好用?四款高品质眼镜清洗机力荐!
  • 基于Java语言的充电桩平台+云快充协议+充电桩管理后台+充电桩小程序
  • 【Docker】05-Docker部署前端项目
  • 电子摄像头分割系统源码&数据集分享
  • RKMEDIA画面质量调节-QP调节
  • 电脑怎么卸载软件?学会这6个卸载软件技巧就够了(精选)
  • 基于Tensorrt C++ API 构建YOLOV5实现engine以及推理
  • PhpStudy-PHP5.4.45后门漏洞应用程序(C++/base64/winhttp)
  • OmniCorpus数据集:最大(百亿级别)多模态数据集
  • 深入理解C语言中的内存分配函数:malloc、calloc、realloc
  • Modern CMake 简明教程(5)- 安装
  • Redis篇(面试题 - 连环16炮)(持续更新迭代)
  • 【笔记】I/O总结王道强化视频笔记
  • WSL--安装各种软件包