“答开发者问”之HarmonyOS鸿蒙Next技术问题解析 第15期
“答开发者问”之HarmonyOS鸿蒙Next技术问题解析 第15期
本期问题如下(解决方案见评论区):
- 关于HarmonyOS Next上架签名问题?
- onTouch事件在点击的时候一直会触发TouchType的Move状态?
- 沉浸式模式怎么开启?
- Scroll组件中的布局如何居顶展示?
- 如何感知@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
问题五:如何感知@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属于正常现象,主要源于以下特性与处理逻辑:
-
事件机制特性:
- 触控采样率差异:changedTouches按屏幕刷新率重采样,touches按器件刷新率上报。真机的触摸传感器通常具有高灵敏度,即使手指轻微抖动(用户可能感知不到),传感器仍会捕捉到坐标变化并触发Move事件。
-
系统级事件处理:
- 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,打算上架,有几个问题想请教下:
- 问题一:签名目前是用个人华为账号打包生成的。上架需要用企业的账号,我需要换成企业账号登录然后重新获取签名再打包吗?
- 问题二:发布证书有没有时效性?
- 问题三:目前包名和安卓版本的一样,需要更换包名吗?
解决方案:
- 和是不是企业账号无关,只和签名文件以及包名有关。最终上架需要在上架主体账号下新建的AG项目,上架时会检测上架包信息与AG项目的包名以及签名是否一致,不一致则无法通过审核。关于如何配置签名文件,可以参考:发布应用-发布应用 - 华为HarmonyOS开发者。
- 发布证书有效期通常是3年,证书失效后依赖证书生成的Profile同步失效,证书过期后不可以延期,需要重新申请证书。
- HarmonyOS Next版本的应用上架应用市场时包名不能跟同应用安卓版本的一样,必须另起包名。
原链接:
请教下鸿蒙上架签名问题-华为开发者问答 | 华为开发者联盟 (huawei.com)
HarmonyOS Next是基于微内核架构的分布式操作系统,采用自主研发的鸿蒙内核,不依赖Linux/Android基础。开发主要使用ArkTS语言,它是TypeScript的超集,专为鸿蒙应用设计。分布式能力通过软总线技术实现设备间低时延通信。UI框架采用声明式开发范式,支持一次开发多端部署。系统安全通过TEE微内核和形式化验证保障。性能优化方面采用确定性时延引擎,提升响应速度20%。
针对HarmonyOS Next开发者提出的5个技术问题,以下是专业解答:
-
上架签名问题: 使用DevEco Studio生成签名证书,在项目配置中设置signingConfigs。确保在build.gradle中配置正确的签名信息,包括storeFile、storePassword等关键参数。
-
onTouch事件Move状态问题: 这是预期的触控行为。如需区分点击和滑动,建议:
- 记录初始坐标
- 在Move事件中计算位移差
- 设置阈值判断是点击还是滑动
- 沉浸式模式开启: 在Ability的onWindowStageCreate中调用:
window.setWindowSystemBarEnable(["status","navigation"])
window.setWindowSystemBarProperties({
navigationBarColor: "#00000000",
statusBarColor: "#00000000",
navigationBarContentColor: "#FF0000",
statusBarContentColor: "#FF0000"
})
- Scroll组件居顶布局: 使用Flex布局配合justifyContent(FlexAlign.Start)属性:
Scroll() {
Column() {
// 内容
}
.width('100%')
.justifyContent(FlexAlign.Start)
}
.width('100%')
.height('100%')
- 感知@Component组件显隐: 可通过组件的aboutToAppear和aboutToDisappear生命周期回调:
[@Component](/user/Component)
struct MyComponent {
aboutToAppear() {
// 组件显示时触发
}
aboutToDisappear() {
// 组件隐藏时触发
}
}