2023黑马程序员鸿蒙课程-状态管理-任务统计案例

鸿蒙第16篇——数据持久化 本文介绍的数据持久化是指鸿蒙应用的数据持久化存储。它是将内存中的数据通过文件或数据库的形式保存到设备存储中。鸿蒙支持多种数据存储方式, 包括用户首选项Preferences、 键值型数据库KV-Store和关系型数据库。 阅读详情

话不多说,我们先展示一下运行效果嘿嘿

我们可以随便添加新的任务,可以勾选任务,也可以随时向左划去删除该任务: 

首先呢,我们得先创建一个任务类,初始值我们定义为布尔值boolean = false,我们通过改变布尔值的方式去修改任务的状态.

这是代码:

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

接下来这个很好理解, 去设置一个@Style, 控制每一个任务的样式,这样可以让我们的代码更为简洁。  我们一会需要的时候,直接调用这个函数去修饰每个任务小板块的样式就可以了。

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

接下来我们直接初始化这些变量。   finishedTask 其实是左边这个数字, totalTask是右边的这个数字。 当我们增加删除任务的时候,进度条也会随之改变。

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

每一次改变,我们都会触发这个函数。

// 任务修改时候触发的一个函数
handleTaskChange(){
  // 2. 更新任务总数量
  this.totalTask = this.tasks.length
  // 2. 更新已经完成函数的数量
  this.finishedTask = this.tasks.filter(item=>item.finished).length
}

首先我们先写任务进程部分, 因为要逐一解释一些关键字,所以我代码注释写的非常清楚,这里我就不过多解释了:

  // 现在我用这个容器 Stack(){.......} 将我的进度条以及这个百分比的进度值堆在一起, 这样进度条就和进度值重叠了。
  Stack(){
    // 进度条的写法是 Progress({.......})  在这里我选的是环形进度条
    Progress({
      value:this.finishedTask,
      total:this.totalTask,
      type: ProgressType.Ring
    })
      .width(100)      

    // 因为我用了 .justifyContent(FlexAlign.SpaceEvenly) 这个属性,它是用于平均分配的。 假设
    // 这里我不使用 Row() 再去把这个进度数字弄成一行,会导致百分比左右两边的数字隔的比较远。
    Row(){
      Text(this.finishedTask.toString())
        .fontSize(24)
        .fontColor('#36D')
      Text(' / '+this.totalTask.toString())
        .fontSize(24)
    }
  }


}
.card()
.margin({top:20,bottom:30})
.justifyContent(FlexAlign.SpaceEvenly)

接着我们新增按钮,当按一下按钮,我们就可以新增一个任务。当然这个按钮新增完数据后,紧跟着就得更改进度条,让其保持一致性。   更改进度条方法很简单,调用刚刚写好的那个 handleTaskChange 函数就行了。

// 2.新增任务按钮
Button('新增任务')
  .width(200)
  .onClick(()=>{
    // 1. 新增任务数据
    this.tasks.push(new Task())
    // 2. 更新任务总数量
    // this.totalTask = this.tasks.length
    // 上面这句省略了,增加函数的复用性, 专门写了个函数让我们来调用,功能和上面一样
    this.handleTaskChange()
  })

好了,我们重头戏就在这里。 我的注释这块写的非常非常详细,大家有问题可以仔细阅读。

  // 3. 任务列表, 遍历每一个新增的任务
    // 第一假如新增任务溢出屏幕,我们必须使用List容器
    // 第二 我们要滑动删除新增功能,也需要这个功能
    List({space:10}){
      ForEach(
        this.tasks,
        (item: Task, index) => {
          // List里面千万千万不可以直接写 Row(){} 必须用ListItem(){} 包裹着它,否则一定会报错。我遇到很多次了!!!
          ListItem(){
            Row(){
              Text(item.name)
                .fontSize(20)
              // 这里我用来一个复选框
              Checkbox()
                // 默认值是False,   finished: boolean = false  说明没有选中。 如果选中则修改默认值, 用布尔值去判断
                .select(item.finished,)
                  // onchange 是人为的去做勾选, 或者取消勾选
                .onChange(val => {
                  // 1.更新当前任务状态
                  item.finished = val
                  // 2. 更新已经完成函数的数量
                  // this.finishedTask = this.tasks.filter(item=>item.finished).length
                  // 上面这句省略了,增加函数的复用性, 专门写了个函数让我们来调用,功能和上面一样
                  this.handleTaskChange()
                })
            }
            // 给予每一个新增任务1属性
            .card()
            // 修改每一个新增的任务卡片布局,让其每行在手机正中间
            .justifyContent(FlexAlign.SpaceBetween)
          }
          // 在ListItem后面去跟一个函数,具体可以查官方文档
          // 建议用局部函数, 因为我们要操作外面定义的数组,更方便
          .swipeAction({end:this.DeleteButton(index)})

        }
      )
    }
    .width('100%')
    //任务列表必须设置高度,否则没办法往下拉。  但不能写成.height('100%') 这样没有效果。
    .layoutWeight(1)
    // 让任务列表居中
    .alignListItem(ListItemAlign.Center)




  }


  // 这是Column样式
  .width('100%')
  .height('100%')
  .backgroundColor('#F1F2F3')
}

最后一部分我们写最后一个功能,那就是删除按钮,也很重要的哈,向左划每个任务条,就能看到删除按钮,点击删除就好了, so easy!

@Builder DeleteButton(index:number){
  Button(){
    Image($r('app.media.return'))
      .fillColor(Color.White)
      .width(20)

  }
  .width(40)
  .height(40)
  .type(ButtonType.Circle)
  .backgroundColor(Color.Red)
  .margin(5)
  .onClick(()=>{
    // 把角标对应的元素删掉
    this.tasks.splice(index,1)
    // 每删除一个任务, 发生变更,任务一旦发生变更,数组内容变更。 更新任务进程
    this.handleTaskChange()
  })
}

以上是每段代码的解析,我知道有些繁琐, 我接下来会把整个代码给大家,直接复制粘贴到编译器就可以实现了。

// 任务类
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:'#1F000000',offsetX:2,offsetY:4})
}

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

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

  // 任务修改时候触发的一个函数
  handleTaskChange(){
    // 2. 更新任务总数量
    this.totalTask = this.tasks.length
    // 2. 更新已经完成函数的数量
    this.finishedTask = this.tasks.filter(item=>item.finished).length
  }

  build() {

    Column({space:10}){
      Row(){
        Text('任务进程')
          .fontSize(30)
          .fontWeight(FontWeight.Bold)


        // 现在我用这个容器 Stack(){.......} 将我的进度条以及这个百分比的进度值堆在一起, 这样进度条就和进度值重叠了。
        Stack(){
          // 进度条的写法是 Progress({.......})  在这里我选的是环形进度条
          Progress({
            value:this.finishedTask,
            total:this.totalTask,
            type: ProgressType.Ring
          })
            .width(100)

          // 因为我用了 .justifyContent(FlexAlign.SpaceEvenly) 这个属性,它是用于平均分配的。 假设
          // 这里我不使用 Row() 再去把这个进度数字弄成一行,会导致百分比左右两边的数字隔的比较远。
          Row(){
            Text(this.finishedTask.toString())
              .fontSize(24)
              .fontColor('#36D')
            Text(' / '+this.totalTask.toString())
              .fontSize(24)
          }
        }


      }
      .card()
      .margin({top:20,bottom:30})
      .justifyContent(FlexAlign.SpaceEvenly)


      // 2.新增任务按钮
      Button('新增任务')
        .width(200)
        .onClick(()=>{
          // 1. 新增任务数据
          this.tasks.push(new Task())
          // 2. 更新任务总数量
          // this.totalTask = this.tasks.length
          // 上面这句省略了,增加函数的复用性, 专门写了个函数让我们来调用,功能和上面一样
          this.handleTaskChange()
        })

      // 3. 任务列表, 遍历每一个新增的任务
      // 第一假如新增任务溢出屏幕,我们必须使用List容器
      // 第二 我们要滑动删除新增功能,也需要这个功能
      List({space:10}){
        ForEach(
          this.tasks,
          (item: Task, index) => {
            // List里面千万千万不可以直接写 Row(){} 必须用ListItem(){} 包裹着它,否则一定会报错。我遇到很多次了!!!
            ListItem(){
              Row(){
                Text(item.name)
                  .fontSize(20)
                // 这里我用来一个复选框
                Checkbox()
                  // 默认值是False,   finished: boolean = false  说明没有选中。 如果选中则修改默认值, 用布尔值去判断
                  .select(item.finished,)
                    // onchange 是人为的去做勾选, 或者取消勾选
                  .onChange(val => {
                    // 1.更新当前任务状态
                    item.finished = val
                    // 2. 更新已经完成函数的数量
                    // this.finishedTask = this.tasks.filter(item=>item.finished).length
                    // 上面这句省略了,增加函数的复用性, 专门写了个函数让我们来调用,功能和上面一样
                    this.handleTaskChange()
                  })
              }
              // 给予每一个新增任务1属性
              .card()
              // 修改每一个新增的任务卡片布局,让其每行在手机正中间
              .justifyContent(FlexAlign.SpaceBetween)
            }
            // 在ListItem后面去跟一个函数,具体可以查官方文档
            // 建议用局部函数, 因为我们要操作外面定义的数组,更方便
            .swipeAction({end:this.DeleteButton(index)})

          }
        )
      }
      .width('100%')
      //任务列表必须设置高度,否则没办法往下拉。  但不能写成.height('100%') 这样没有效果。
      .layoutWeight(1)
      // 让任务列表居中
      .alignListItem(ListItemAlign.Center)




    }


    // 这是Column样式
    .width('100%')
    .height('100%')
    .backgroundColor('#F1F2F3')
  }


  @Builder DeleteButton(index:number){
    Button(){
      Image($r('app.media.return'))
        .fillColor(Color.White)
        .width(20)

    }
    .width(40)
    .height(40)
    .type(ButtonType.Circle)
    .backgroundColor(Color.Red)
    .margin(5)
    .onClick(()=>{
      // 把角标对应的元素删掉
      this.tasks.splice(index,1)
      // 每删除一个任务, 发生变更,任务一旦发生变更,数组内容变更。 更新任务进程
      this.handleTaskChange()    
    })
  }

}

代码的注释我写的非常非常详细,不懂的童鞋要仔细看哈!!!

哦对了,这是我删除键引用的一个小图片,如果你懒的找话可以拿去用,命名为:return.png ,放在 app.media.retur 文件夹下面。

。

【鸿蒙专题与实战】测试体系:单元测试、组件测试与 UI 测试 本文系统讲解鸿蒙开发中的三层测试实践:底层单元测试(用Hypium框架,优先覆盖纯函数、边界与异常)、中层ViewModel逻辑、顶层仅测3-5条关键UI路径。强调测试应“越往下写得越多”,因单元测试快且成本低,而UI测试慢易出错。通过实例说明断言拆分提升定位效率,结合覆盖率报告(hvigorwtest --coverage)发现盲区,核心是“用覆盖率找漏测,而非追求数字”。附五步落地清单:建测试文件、按优先级补用例、精简UI测试、生成报告、定位未覆盖行。下一篇将开启实战项目:从需求到上架全流程。 阅读详情

相关推荐

HarmonyOS 分布式深度:跨端迁移、数据对象与多设备协同

本文深入解析鸿蒙分布式能力实战,聚焦跨端迁移、协同与共享三大形态,详解权限配置、设备发现、onContinue状态管理及分布式数据对象、KV同步机制。强调“先分清场景”“前置条件必全”“数据需重验”,揭示迁移失败、同步失效等七大常见坑,指导开发者规避陷阱,实现真实可用的多设备协同。

信息安全领域优质创作者|操作系统领域专家 97

学鸿蒙的又香了!企业上门定制,年薪22W起~

“鸿蒙系统不就是一个套壳安卓吗?”“三分天下,鸿蒙居其一,拭目以待。”“多年坚持极为不易,终于跨过一座大山了。”华为鸿蒙系统面世以来,网友们态度不一。之所以态度不同,根本原因是坐的位置不同。有人争做第一波吃螃蟹的人,有人还在问播妞“现在学鸿蒙有前途吗?能找到工作吗?”当你还在观望的时候,黑马学长学姐已经开始赚钱了!黑马年中就业报告第四弹——鸿蒙学科上半年就业报告来啦!2024上半年,黑马鸿蒙学生未...

传智播客的专栏 616

利用Docker Compose简化openGauss多节点容器化部署

本文详细介绍了如何利用Docker Compose简化openGauss多节点容器化部署,从环境准备到配置文件编写,再到集群部署与验证,提供了一套完整的解决方案。通过Docker Compose,原本复杂的手动部署流程被大幅简化,显著提升了部署效率和可靠性,特别适合企业级开源数据库的高可用架构需求。

weixin_30338481的博客 60

黑马程序员鸿蒙课程 ArkUI 组件(适合小白学习)

2023黑马程序员鸿蒙课程 ArkUI 组件(适合小白学习)

programmer1027的博客 967

详解电路设计中的RC电路

​ 一、什么是RC电路 RC电路是指由电阻R和电容C组成的电路,它是脉冲产生和整形电路中常用到 的电路。 常见的RC充、放电电路、RC积分电路合RC微分电路接下来详细讲解。 二、RC充、放电电路 RC充、放电电路如下图所示,下面通过充电和放电两个过程来分析此电路。 ​RC充、放电电路图 (1)RC充电电路 RC充电电路图如下图(a)所示 RC充电电路图及充电曲线图 ​由上图分析: 将上图a中开关S置于“1”处,电源E开始通过电阻R对电容C充电,由于刚开始充电时电容两端没有..

IT xiaobai 4万+

基于Simplis仿真的UC2843芯片建模与关键参数优化指南

本文详细介绍了使用Simplis仿真工具为UC2843 PWM控制器进行行为级建模的方法与关键参数优化实践。通过精确搭建芯片内部振荡器、误差放大器及电流采样等核心模块,工程师可以深入理解其工作原理,并利用模型优化振荡频率、最大占空比及反馈环路等关键参数,从而提升开关电源设计的效率与可靠性。

efc1234567的博客 460

薪资高于传统开发岗位50%!鸿蒙工程师待遇爆表

随着科技的飞速发展,一个新兴的职业正在悄然崛起——鸿蒙工程师。这个职位不仅拥有令人瞩目的技术挑战,更以其薪资待遇吸引了无数技术人才的目光。据统计,鸿蒙工程师的薪资普遍高于传统开发岗位50%,成为了当前IT行业中的“香饽饽”。

xiaokangss的博客 1357

linux系统宝塔服务器temp文件夹里总是被上传病毒php脚本

服务器时不时的会发送短信说你服务器有病毒,找到了这个tmp文件,删除了之后又有了。确实是有很多人就这么无聊,每天都攻击你的服务器。找了很久的原因,网上也提供了一大堆方法,但都是很简陋的答案,具体怎么操作并没有说。没办法只能自己去排查这个问题。从两个角度来考虑,第一是服务器系统问题,比如宝塔的漏洞。但一时半会看不出问题来。只能去排查自己的项目代码。最后了解到代码确实是存在漏洞的。但代码中也确实了很多的校验,为什么会存在漏洞了?这就不得不从上传的过程开始说起。

guiplan 1497

〖物流终端实战 05〗纯血鸿蒙 ArkTS 高阶性能优化:长列表渲染、组件复用与内存泄漏排查

本文深度剖析鸿蒙ArkTS高阶性能优化,直击长列表卡顿与内存泄漏痛点。针对渲染,指出ForEach全量构建的缺陷,强调采用LazyForEach(V2推荐Repeat)配合增量通知及稳定业务Key;针对组件复用,明确@Reusable仅复用实例不重置状态,必须在aboutToReuse中手动清理UI状态;针对内存泄漏,总结全局监听未注销、定时器未清理及长生命周期对象持有页面引用三大元凶,并指导通过DevEco Profiler的Heap快照排查引用链。文章强调优化需遵循“先定位后改代码”原则,助力开发者打造

Eyf • 半字节的博客 676

uniapp [全端兼容] - 实现内网使用天地图离线地图,详解项目加载天地图的离线地图服务器部署与使用教程示例源码,Uniapp如何实现天地图的离线加载部署在内网访问(兼容H5、微信小程序、App)

uniapp天地图如何离线访问,无需网络调用天地图API,天地图离线地图,天地图——内网使用离线地图,uniapp中加载天地图的离线地图,uniAPP实现天地图离线访问,在内网中无法直接使用外网天地图资源怎么办,在uni-app中加载地图 -使用天地图的瓦片数据。UNIAPP天地图离线怎么使用,内网部署天地图,天地图离线瓦片,部分瓦片数据,天地图如何离线,下载天地图离线服务,并用Uniapp+天地图离线部署,天地图私有化部署,实现离线加载天地图,Java+uniapp天地图离线开发,uniapp项目中无网络

🏆 前端领域优质创作者 4900

【软考高级架构】论文范文12——论生成式AI在软件开发中的应用与挑战

随着生成式AI技术的跨越式发展,以大语言模型为代表的生成式AI正在深刻改变软件开发的传统模式。在代码生成、测试构造、文档编写等环节,生成式AI展现出显著的效率提升潜力,但其应用也面临着代码质量不可控、安全漏洞植入、版权合规等严峻挑战。本文以笔者主导的某大型金融企业智能研发辅助平台建设项目为案例,围绕生成式AI在软件开发中的应用实践与应对挑战的策略展开论述。笔者担任系统架构师,负责平台架构设计、模型选型、质量保障机制及安全防线构建。

qq837993702的博客 275

HarmonyOS 7 端侧 AI 图像超分的工程化落地

用户抱怨网络差的时候图片传不上去,更严重的是,大量的私密照片上传到云端,引发了严重的隐私合规审查危机。痛定思痛后,我们决定把 AI 模型直接塞进手机里,用端侧的 NPU 来做推理,但这绝非易事。我们首先在服务端对模型进行了知识蒸馏,把参数砍掉了一大半,然后利用 MindSpore Lite 的转换工具,将模型转成了鸿蒙底层支持的。即便如此,模型依然有 20 多兆,我们最终选择了 FP16 量化,牺牲了极其微小的画质,换取了内存占用减半。推理过程极其消耗 CPU 和内存,稍微大一点的图,处理时间长达几秒。

2602_97267507的博客 159

2026年软考高级网络规划设计师备考指南

在国家网络安全法律法规和政策的指导下,能够依据网络技术发展的趋势进行计算机网络领域的需求分析、规划设计、部署实施、评测、运行维护等工作。 在需求分析阶段,写出网络系统需求规格说明书;在规划设计阶段,完成逻辑结构设计、物理结构设计,选用适宜的网络设备,按照标准规范编写系统设计文档及项目开发计划;在部署实施阶段,组织项目施工,对项目实施过程进行质量控制、进度控制、成本管理,能具体指导项目实施;在评测运维阶段,能根据相关标准和规范对网络进行评估测试,能制定运行维护、故障分析与处理机制,确保网络提供正常服务;

鹿鸣天涯 1万+

AppGallery 上架自检 SOP:签名、隐私对齐与包体校验实战【鸿蒙心迹】

上架被驳回多因签名、隐私声明与包体不一致。本文提炼“签名→隐私对齐→包体校验”自检SOP,配套一键脚本与权限三角校验代码,实现90%驳回前置拦截。通过CI强制release签名、代码/声明/功能三者权限对齐、包体完整性校验,确保提审一次过。实战清单可直接抄,让过审从运气变为流程。

wdracky的专栏 326

【LLC快速上手系列】LLC轻载时:开关频率 + 死区时间 联合优化!

轻载优化,频率别飞天,死区要有耐心。两手一起抓,效率高到笑。😎。

weixin_43199439的博客 1183

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

窗口销毁了监听还在,HarmonyOS 7 生命周期释放的归属分界

综上所述,onWindowStageWillDestroy 是窗口监听的最后安全出口,onWindowStageDestroy 只负责断开窗口引用,onDestroy 管 Ability 级资源——三者不是“程度不同的退出回调”,而是各自有明确的归属范围。窗口监听的所有者是 WindowStage,定时器的所有者是 UIAbility,播放器的所有者是页面或 Ability(取决于你在哪一层创建的),ApplicationContext 监听的所有者是 Ability 的 context。

qq_61905492的博客 203

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

20 嵌入式系统架构:架构模式、实时操作系统、鸿蒙案例

嵌入式架构模式怎么选、RTOS 和通用操作系统差在哪、优先级反转怎么破?本篇把前后台、中断驱动、管态目态几种结构排成一条演进线,手把手算 RMS 可调度界限、判断任务集能不能跑得动,再把优先级继承与优先级天花板两种解法对上号,配鸿蒙案例讲清工程落地。

weixin_46316564的博客 194

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

鸿蒙平板能当电脑第二块屏幕吗?ToDesk、向日葵镜像/副屏实测

本文对比测试了ToDesk鸿蒙版4.8.3.0与向日葵鸿蒙版16.8.0在连接鸿蒙平板作为电脑副屏的表现。结果显示,ToDesk可直接实现镜像屏与扩展屏功能,支持参数调节,操作流畅;而向日葵副屏需开通会员才能使用。对于已有鸿蒙平板的用户,ToDesk能有效拓展工作空间,提升多任务效率,尤其适合临时办公、出差等场景,具备较高实用价值。

2501_91062530的博客 2340

React Native for OpenHarmony 实战:react-native-file-logger 日志库鸿蒙化适配

本文记录了将 react-native-file-logger 适配至 OpenHarmony 的实战过程。基于鸿蒙 7.0 模拟器,通过 5 个 TurboModule 方法实现日志落盘、轮转、列举与删除,采用 fileIo 实现核心功能,支持按大小和跨天轮转,归档文件命名精确至毫秒。邮件发送功能因平台限制按能力边界处理,明确拒绝并提示用户手动导出。验证通过,日志文件结构清晰,内容完整,产出 HAP 示例与独立 HAR 库,中英双语文档齐全,为鸿蒙应用日志管理提供可靠方案。

m0_62930060的博客 262

鸿蒙沉浸光感开发适配

设备材质档位:EXQUISITE(精致,全光效,高性能设备)、GENTLE(均衡,默认)、SMOOTH(轻量,仅基础效果,低算力设备)、ADAPTIVE(自适应,系统自动识别算力选档,业务首选);用户系统设置三档(强/均衡默认/弱):本质是对透明度、反色率、折射强度的精细调控。用户的三档偏好由系统底层自动映射到渲染参数,应用只需一次定义材质,界面就会随用户设置平滑过渡,完全不需要针对三档分别写适配。

qq_63223749的博客 415

【鸿蒙心迹】深色模式适配全链路——从配置到自定义(HarmonyOS 7.x)

系统切深色模式,应用没跟着变;图片在深色模式下刺眼;自定义绘制颜色没适配——深色模式不是"换个背景色",是颜色/图片/材质/状态栏的全链路适配。本文用涟漪睡眠 App 适配深色模式为案例,给完整方案与 5 个踩坑。

腾讯云创作之星、华为云云享专家,深耕电商全栈高并发系统实战,分享可商用商城项目源码。 365

鸿蒙远程控制软件哪个好?华为远程PC、ToDesk、向日葵三款实测

综合来看,本次横测最终更推荐ToDesk:它在支持跨品牌连接的基础上,外接鼠标、全屏远控、移动设备协助和多屏功能覆盖更完整,更适合作为主力远控工具。

2401_85083137的博客 348

HarmonyOS 7 应用冷启动与包体积优化实录

我们在构建脚本里加入了一个自动转换任务,将除了极其复杂的透明图之外的所有静态资源,全部转换为 WebP 格式。为了这 5% 的用户,让 95% 的用户承担 30MB 的下载成本,显然不划算。目录,里面躺着无数历史遗留的高清切图,有些是早被废弃的活动图,有些是同一张图的多个尺寸备份。这一招,直接砍掉了将近 15MB 的死重。我们将短视频相关的所有代码、图片、甚至底层的播放器三方库,全部剥离到了独立的 Feature 模块(HSP)中。包变小了,启动速度自然会快一点,但真正的瓶颈在于冷启动时的初始化逻辑。

2502_91284977的博客 172

导航该收起来,还是留在左边?HarmonyOS 6 侧栏小练习

手机宽度下,分类一直占着左边,正文会被挤得很窄;宽窗口下,每次切分类都先打开一个抽屉,又显得多了一步。这次让同一个导航内容根据空间换一种出现方式:宽时常驻左侧,窄时放到覆盖式抽屉里。分类选中状态始终是一份,切完分类后收起抽屉,正文立即显示对应路线。判断这份导航是否合适,可以回到一次切路线的动作:找得到目录,选得中分类,关掉后正文仍是刚才那一条。宽窄变化只影响目录出现的位置和时机。后面扩展层级或接入真实路线时,也先保住这一条连贯的操作。

程序猿追的博客 253

HarmonyOS 7 新特性14:音频编创深潜——12节点格式契约、7链时延表与EQ不设参引发的系统库崩溃

本文深度剖析HarmonyOS 7音频编创系统中12类节点的格式契约与链式处理机制,揭示因未设置均衡器增益参数导致系统库崩溃的核心问题。通过7条链路实测,验证降噪节点引入约3秒延迟,音源分离首测成功(耗时14.6秒),并发现格式契约存在软约束(如降噪输出强制16k/1ch但系统静默容忍错误配置)。研究确认:节点格式由链尾决定,需动态查表配置;均衡器等节点必须调用参数接口初始化缓冲,否则触发不可捕获的SIGSEGV。

轻口味的专栏 256

从 JChemPaint 到 BondDraw:一个化学结构编辑器的鸿蒙 PC 上架实录

这次上架最大的收获是流程的确定性:AGC 五步——建应用、签名、传包、审核、上架——对任何形态的鸿蒙 PC 应用都一样,坑集中在签名分流和工程收尾两处。而纯 ArkTS 路线的回报也在这一刻兑现:几百 KB 的包体、零权限的权限表、一个可以低成本持续迭代的市场通道——“版本/升级”入口已经在 AGC 里候着,下一版只是 versionCode 加一的事。

全沾软贱开发攻城狮 1万+
上一篇: 黑马程序员鸿蒙课程 ArkUI 组件(适合小白学习)
魏凯文2000
博客等级 码龄5年 8粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值