“答开发者问”之HarmonyOS鸿蒙Next技术问题解析 第15期

“答开发者问”之HarmonyOS鸿蒙Next技术问题解析 第15期

本期问题如下(解决方案见评论区):

  1. 关于HarmonyOS Next上架签名问题?
  2. onTouch事件在点击的时候一直会触发TouchType的Move状态?
  3. 沉浸式模式怎么开启?
  4. Scroll组件中的布局如何居顶展示?
  5. 如何感知@Component组件的show和hide?

向所有参与社区互助的开发者致以最诚挚的感谢!

特别感谢本期优质答复贡献者: @乌拉大乌拉@城中的雾@HarmonyPass@云朵@杰克

社区的蓬勃发展,离不开每一位积极参与者的贡献。本期“答开发者问”栏目,精选自广大热心开发者针对提问帖所贡献的众多优质答复之中。它们不仅是智慧与经验的璀璨结晶,更是“众人拾柴火焰高”这一真理的生动体现。在此,我们由衷地感谢每一位热心参与、乐于分享的开发者,是你们的热情与智慧,让这个社区充满了生机与活力,每一次的解答都是对技术探索精神的最好诠释。同时,我们也诚挚邀请更多的开发者加入到这场智慧碰撞的盛宴中来。无论是抛出难题寻求解答,还是慷慨解囊分享经验,您的每一份参与都将为鸿蒙开发者社区注入新的活力,推动我们共同前行,在技术的海洋中扬帆远航。

答开发者问系列汇总:

“答开发者问”系列汇总(持续更新中…)

往期问题回顾:

“答开发者问”之HarmonyOS技术问题解析 第1期-华为开发者问答 | 华为开发者联盟 (huawei.com)

“答开发者问”之HarmonyOS技术问题解析 第2期-华为开发者问答 | 华为开发者联盟 (huawei.com)

“答开发者问”之HarmonyOS技术问题解析 第3期-华为开发者问答 | 华为开发者联盟 (huawei.com)

“答开发者问”之HarmonyOS技术问题解析 第4期-华为开发者问答 | 华为开发者联盟 (huawei.com)

“答开发者问”之HarmonyOS技术问题解析 第5期-华为开发者问答 | 华为开发者联盟 (huawei.com)

“答开发者问”之HarmonyOS技术问题解析 第6期-华为开发者问答 | 华为开发者联盟 (huawei.com)

“答开发者问”之HarmonyOS技术问题解析 第7期-华为开发者问答 | 华为开发者联盟 (huawei.com)

“答开发者问”之HarmonyOS技术问题解析 第8期-华为开发者问答 | 华为开发者联盟 (huawei.com)

“答开发者问”之HarmonyOS技术问题解析 第9期-华为开发者问答 | 华为开发者联盟 (huawei.com)

“答开发者问”之HarmonyOS技术问题解析 第10期-华为开发者问答 | 华为开发者联盟 (huawei.com)

“答开发者问”之HarmonyOS技术问题解析 第11期-华为开发者问答 | 华为开发者联盟 (huawei.com)

“答开发者问”之HarmonyOS技术问题解析 第12期-华为开发者问答 | 华为开发者联盟 (huawei.com)

“答开发者问”之HarmonyOS技术问题解析 第13期-华为开发者问答 | 华为开发者联盟 (huawei.com)

“答开发者问”之HarmonyOS技术问题解析 第14期-华为开发者问答 | 华为开发者联盟 (huawei.com)

注意:

开发者小伙伴们,规范提问,高效沟通!更快得到问题答案的秘诀来啦,点击链接直达


更多关于“答开发者问”之HarmonyOS鸿蒙Next技术问题解析 第15期的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

问题五:如何感知@Component组件的show和hide?

有没有什么办法能感知@Component组件的展示和隐藏?

解决方案:

推荐优先使用Navigation,可以在NavDestination组件下通过onShown和onHidden方法来判断显示和隐藏,代码如下:

@Builder
export function NavDemoBuilder() {
  NavDemo()
}

[@Component](/user/Component)
export struct NavDemo {
  @Consume('pathStack') pathStack: NavPathStack;

  build() {
    NavDestination()
    .onShown(() => {

    })
    .onHidden(()=>{

    })
  }
}

当没有使用Navigation时,组件的显示和隐藏参考onVisibleAreaChange方法:

.onVisibleAreaChange([0.0, 1.0], async (isVisible: boolean, currentRatio: number) => {
  if (isVisible && currentRatio >= 1.0) {
    //完全可见
  }
  if (!isVisible && currentRatio <= 0.0) {
    //完全不可见
  }
})

原理可以参考:组件可见区域变化事件-组件变化事件-通用事件-ArkTS组件-ArkUI(方舟UI框架)-应用框架 - 华为HarmonyOS开发者

原链接:

[如何感知@Component页面的show和hide-华为开发者问答 | 华为开发者联盟 (huawei.com)](https://developer.huawei.com/consumer/cn/forum/topic/0201186419283271046?fid=0109140870620153026)

更多关于“答开发者问”之HarmonyOS鸿蒙Next技术问题解析 第15期的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


问题四:Scroll组件中的布局如何居顶展示?

Scroll组件中的布局,内容如何居顶展示?要求当list不为空时可以正常滚动,list为空时内容居顶显示。

代码如下:

@Component
@Entry
struct IndexDemo {
  list: number[] = []

  build() {
    Scroll() {
      Column() {
        ForEach(this.list, (item: number) => {
          Text(item.toString())
            .height(150)
        })
        Text("list为空时居顶显示")
          .height('10%')
      }.width('100%')
      .backgroundColor('#ff5500')

    }
    .width('100%')
    .height('100%')
    .scrollable(ScrollDirection.Vertical)
  }
}

解决方案:

可以给Scroll()组件加一个align(Alignment.Top),demo如下:

@Component
@Entry
struct IndexDemo {
  list: number[] = []

  build() {
    Scroll() {
      Column() {
        ForEach(this.list, (item: number) => {
          Text(item.toString())
            .height(150)
        })
        Text("list为空时居顶显示")
          .height('10%')
      }.width('100%')
      .backgroundColor('#ff5500')

    }
    .width('100%')
    .height('100%')
    .scrollable(ScrollDirection.Vertical)
    .align(Alignment.Top)
  }
}

原链接:

Scroll组件中的布局如何居顶展示-华为开发者问答 | 华为开发者联盟 (huawei.com)

问题三:沉浸式模式怎么开启?

沉浸式模式怎么开启?

解决方案:

沉浸式方案包括两种:

第一种:整个应用沉浸式,只需要在EntryAbility.ets文件中以下方法中设置:

onWindowStageCreate(windowStage: window.WindowStage): void {
   //...省略部分代码
   let windowClass: window.Window | undefined = undefined;
   windowStage.getMainWindow((err: BusinessError, data) => {
       windowClass.setWindowLayoutFullScreen(true);
   })
}

值得注意的是:沉浸式布局生效时,布局不避让状态栏与底部导航区域,组件可能产生与其重叠的情况。

第二种:在需要展现沉浸式的页面单独设置:

aboutToAppear(): void {
    window.getLastWindow(this.getUIContext().getHostContext(), (err, win: window.Window) => {
      win.setWindowLayoutFullScreen(true)
    })
}

aboutToDisappear(): void {
    window.getLastWindow(this.getUIContext().getHostContext(), (err, win: window.Window) => {
      win.setWindowLayoutFullScreen(false)
    })
}

原链接

问题二:onTouch事件在点击的时候一直会触发TouchType的Move状态?

在HarmonyOS应用开发中,onTouch事件在真机上持续触发TouchType.Move属于正常现象,主要源于以下特性与处理逻辑:

  1. 事件机制特性

    • 触控采样率差异:changedTouches按屏幕刷新率重采样,touches按器件刷新率上报。真机的触摸传感器通常具有高灵敏度,即使手指轻微抖动(用户可能感知不到),传感器仍会捕捉到坐标变化并触发Move事件。
  2. 系统级事件处理

    • HarmonyOS框架为优化交互体验,会主动上报细微的触控变化。这在需要高精度触控的场景(如绘图应用)中是有益的,但在点击场景下可能造成多次Move事件触发。

如果不需要无效的移动事件,可通过代码逻辑过滤掉:

@State startX: number = 0;
@State startY: number = 0;
// 设置移动阈值(单位:vp)
readonly MOVE_THRESHOLD: number = 5; 

.onTouch((event: TouchEvent) => {
  if (!event.touches || event.touches.length === 0) return;

  switch (event.type) {
    case TouchType.Down:
      this.startX = event.touches.x;
      this.startY = event.touches.y;
      console.log('按下');
      break;

    case TouchType.Move:
      const currentX = event.touches.x;
      const currentY = event.touches.y;
      // 计算偏移量
      const deltaX = Math.abs(currentX - this.startX);
      const deltaY = Math.abs(currentY - this.startY);

      if (deltaX > this.MOVE_THRESHOLD || deltaY > this.MOVE_THRESHOLD) {
        console.log('有效移动:', currentX, currentY);
        // 更新起始坐标
        this.startX = currentX;
        this.startY = currentY;
      }
      break;

    case TouchType.Up:
      console.log('抬起');
      break;
  }
})

原链接onTouch事件在点击的时候,一直会触发TouchType的Move状态-华为开发者问答 | 华为开发者联盟 (huawei.com)

期待HarmonyOS能在未来带来更多创新的技术和理念。

问题一:关于HarmonyOS Next上架签名问题?

开发了一个HarmonyOS Next APP,打算上架,有几个问题想请教下:

  • 问题一:签名目前是用个人华为账号打包生成的。上架需要用企业的账号,我需要换成企业账号登录然后重新获取签名再打包吗?
  • 问题二:发布证书有没有时效性?
  • 问题三:目前包名和安卓版本的一样,需要更换包名吗?

解决方案:

  1. 和是不是企业账号无关,只和签名文件以及包名有关。最终上架需要在上架主体账号下新建的AG项目,上架时会检测上架包信息与AG项目的包名以及签名是否一致,不一致则无法通过审核。关于如何配置签名文件,可以参考:发布应用-发布应用 - 华为HarmonyOS开发者
  2. 发布证书有效期通常是3年,证书失效后依赖证书生成的Profile同步失效,证书过期后不可以延期,需要重新申请证书。
  3. HarmonyOS Next版本的应用上架应用市场时包名不能跟同应用安卓版本的一样,必须另起包名。

原链接:

请教下鸿蒙上架签名问题-华为开发者问答 | 华为开发者联盟 (huawei.com)

HarmonyOS Next是基于微内核架构的分布式操作系统,采用自主研发的鸿蒙内核,不依赖Linux/Android基础。开发主要使用ArkTS语言,它是TypeScript的超集,专为鸿蒙应用设计。分布式能力通过软总线技术实现设备间低时延通信。UI框架采用声明式开发范式,支持一次开发多端部署。系统安全通过TEE微内核和形式化验证保障。性能优化方面采用确定性时延引擎,提升响应速度20%。

针对HarmonyOS Next开发者提出的5个技术问题,以下是专业解答:

  1. 上架签名问题: 使用DevEco Studio生成签名证书,在项目配置中设置signingConfigs。确保在build.gradle中配置正确的签名信息,包括storeFile、storePassword等关键参数。

  2. onTouch事件Move状态问题: 这是预期的触控行为。如需区分点击和滑动,建议:

  • 记录初始坐标
  • 在Move事件中计算位移差
  • 设置阈值判断是点击还是滑动
  1. 沉浸式模式开启: 在Ability的onWindowStageCreate中调用:
window.setWindowSystemBarEnable(["status","navigation"])
window.setWindowSystemBarProperties({
  navigationBarColor: "#00000000",
  statusBarColor: "#00000000",
  navigationBarContentColor: "#FF0000",
  statusBarContentColor: "#FF0000"
})
  1. Scroll组件居顶布局: 使用Flex布局配合justifyContent(FlexAlign.Start)属性:
Scroll() {
  Column() {
    // 内容
  }
  .width('100%')
  .justifyContent(FlexAlign.Start)
}
.width('100%')
.height('100%')
  1. 感知@Component组件显隐: 可通过组件的aboutToAppear和aboutToDisappear生命周期回调:
[@Component](/user/Component)
struct MyComponent {
  aboutToAppear() {
    // 组件显示时触发
  }

  aboutToDisappear() {
    // 组件隐藏时触发
  }
}
回到顶部