Harmony鸿蒙实战开发-任务目标管理app「可视化任务进度」【源码在文末】

Harmony鸿蒙实战开发-任务目标管理app「可视化任务进度」【源码在文末】


运行工具:DevEco Studio

一、运行演示

1、首页

image-20240720000316350

2、编辑任务进度

image-20240720000357928

3、添加任务

image-20240720000422511

4、删除任务

image-20240720000449005 image-20240720000511167

二、部分代码

import TargetInformation from '../view/TargetInformation';
import AddTargetDialog from '../view/AddTargetDialog';
import TargetList from '../view/TargetList';
import DataModel, { TaskItemBean } from '../viewmodel/DataModel';
import { CommonConstants } from '../common/constant/CommonConstant';
import getCurrentTime from '../common/utils/DateUtil';
import promptAction from '@ohos.promptAction';

@Entry
@Component
struct MainPage {
  @State targetData: Array<TaskItemBean> = DataModel.getData();
  @State totalTasksNumber: number = 0;
  @State completedTasksNumber: number = 0;
  @State latestUpdateDate: string = CommonConstants.DEFAULT_PROGRESS_VALUE;
  @Provide @Watch('onProgressChanged') overAllProgressChanged: boolean = false;
  dialogController: CustomDialogController = new CustomDialogController({
    builder: AddTargetDialog({
      onClickOk: (value: string): void => this.saveTask(value)
    }),
    alignment: DialogAlignment.Bottom,
    offset: {
      dx: CommonConstants.DIALOG_OFFSET_X,
      dy: $r('app.float.dialog_offset_y')
    },
    customStyle: true,
    autoCancel: false
  });

  /**
   * Listening targetData.
   */
  onProgressChanged() {
    this.totalTasksNumber = this.targetData.length;
    this.completedTasksNumber = this.targetData.filter((item: TaskItemBean) => {
      return item.progressValue === CommonConstants.SLIDER_MAX_VALUE;
    }).length;
    this.latestUpdateDate = getCurrentTime();
  }

  build() {
    Column() {
      this.titleBar()
      TargetInformation({
        latestUpdateDate: this.latestUpdateDate,
        totalTasksNumber: this.totalTasksNumber,
        completedTasksNumber: this.completedTasksNumber
      })
      TargetList({
        targetData: $targetData,
        onAddClick: (): void => this.dialogController.open()
      })
        .height(CommonConstants.LIST_BOARD_HEIGHT)
    }
    .width(CommonConstants.FULL_WIDTH)
    .height(CommonConstants.FULL_HEIGHT)
    .backgroundColor($r('app.color.index_background'))
  }

  @Builder
  titleBar() {
    Text($r('app.string.title'))
      .width(CommonConstants.TITLE_WIDTH)
      .height($r('app.float.title_height'))
      .fontSize($r('app.float.title_font'))
      .fontWeight(CommonConstants.FONT_WEIGHT_LARGE)
      .textAlign(TextAlign.Start)
      .margin({
        top: $r('app.float.title_margin'),
        bottom: $r('app.float.title_margin')
      })
  }

  /**
   * Save the progress value and update time after you click OK in the dialog box.
   *
   * @param taskName Latest Progress Value.
   */
  saveTask(taskName: string) {
    if (taskName === '') {
      promptAction.showToast({
        message: $r('app.string.cannot_input_empty'),
        duration: CommonConstants.TOAST_TIME,
        bottom: CommonConstants.TOAST_MARGIN_BOTTOM
      });
      return;
    }
    DataModel.addData(new TaskItemBean(taskName, 0, getCurrentTime()));
    this.targetData = DataModel.getData();
    this.overAllProgressChanged = !this.overAllProgressChanged;
    this.dialogController.close();
  }
}

三、源码

通过百度网盘分享的文件:…zip
链接:https://pan.baidu.com/s/1xbu6QWOItJCKOzAaG49Piw
文件已经加密,请联系请加下方(wx号),获取源码,仅一杯奶茶钱
号码:One_PQ

### 如何在鸿蒙OS应用中加载3D模型 为了实现在鸿蒙操作系统(HarmonyOS)中的3D模型加载功能,开发者可以利用WebGL技术。通过结合ArkTS、ArkUI框架以及Stage模型等核心技术,能够构建出支持复杂图形渲染的应用程序[^1]。 #### 创建Canvas元素用于显示3D场景 首先,在HTML页面上定义一个`<canvas>`标签作为绘图区域,并为其指定样式属性以便更好地展示效果: ```html <div class="container"> <canvas id="modelCanvas" width="800" height="600"></canvas> </div> ``` 此部分代码片段展示了如何声明一个具有特定尺寸大小的画布对象,它将成为后续所有三维图像呈现的基础载体[^3]。 #### 初始化WebGL环境并配置着色器 接着,编写JavaScript函数完成WebGL上下文初始化工作,同时准备顶点/片元着色器源码字符串供稍后的编译链接操作使用: ```javascript function initWebGL() { const canvas = document.getElementById('modelCanvas'); let gl; try { gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); if (!gl) throw new Error('无法获取WebGL上下文'); setupShaders(gl); loadModelData(gl); renderScene(gl); // 启动动画循环 } catch (e) { console.error(e.message); } } // 定义简单的顶点着色器代码 const vertexShaderSource = ` attribute vec4 aVertexPosition; uniform mat4 uModelViewMatrix; uniform mat4 uProjectionMatrix; void main(void) { gl_Position = uProjectionMatrix * uModelViewMatrix * aVertexPosition; }`; // 片元着色器负责颜色计算 const fragmentShaderSource = `precision mediump float; uniform vec4 uColor; void main(void) { gl_FragColor = uColor; }`; ``` 上述脚本实现了基本的WebGL初始化流程,包括尝试获得兼容版本的OpenGL ES API接口实例(`getContext`);如果成功,则继续调用辅助方法分别处理着色器创建与模型数据导入事宜。 #### 加载外部3D模型文件 对于实际项目而言,通常会涉及到从服务器下载或本地读取预存好的几何结构描述文档(如OBJ, FBX格式),再经过解析转换成适合GPU快速访问的数据形式传递给WebGL引擎进行最终可视化表达。这里给出一段简化版伪代码示意该过程的关键步骤: ```javascript async function loadModelData(gl) { const response = await fetch('/path/to/model.obj'); // 获取资源路径下的目标文件流 const text = await response.text(); // 将响应体转为纯文本表示 parseObjFile(text).then((geometry) => { uploadToBuffer(gl, geometry.vertices); // 把顶点坐标数组上传至显卡内存空间 drawElements(gl, geometry.indices.length); // 根据索引列表执行绘制命令 }); } ``` 这段异步逻辑说明了怎样借助浏览器内置API高效地取得远程存储位置上的静态资产,并运用自定义工具类解析其内部信息,进而填充到相应的缓冲区内待命输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值