HarmonyOS 鸿蒙Next 手势失效

发布于 1周前 作者 yuanlaile 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 手势失效

使用XComponent作为播放器时,使用gesture实现单击、双击、拖拽和缩放的功能。视频页面默认是竖屏,竖屏时gesture可以正常回调各个手势;但是当我从竖屏转到横屏时,gesture手势在横屏的时候失效了,收不到任何手势的回调。
PS:横竖屏切换我是直接修改的XComponent的大小
build() {
Stack() {
XComponent({
id: this.getXid(),
type: XComponentType.SURFACE,
libraryname: ‘IOTCamera’,
controller: this.controller
})
.onLoad(() => {
TLogUtils.debug(‘PlayerView onLoad is called’)
this.surfaceId = this.controller.getXComponentSurfaceId()
this.orangeSurfaceRect = this.controller.getXComponentSurfaceRect()
TLogUtils.debug(‘onLoad surfaceId:’ + this.surfaceId)

this.controller.getXComponentSurfaceRotation()
})
.onDestroy(() => {
TLogUtils.debug(‘PlayerView onDestroy’)
this.onDestroyListener?.()
})
.width(‘100%’)
.aspectRatio(16 / 9)
.borderRadius(this.radius)

LoadingProgress()
.color(’#A8866B’)
.width(‘50vp’)
.height(‘50vp’)
.visibility(this.loadingVisibility ? Visibility.Visible : Visibility.None)
}.width(this.getWidth())
.aspectRatio(16 / 9)
.gesture(
GestureGroup(GestureMode.Parallel,
TapGesture({ count: 2 })
.onAction((event) => {
let orange = this.orangeSurfaceRect
if (orange) {
let rect = this.controller.getXComponentSurfaceRect()
if (rect.surfaceWidth === orange.surfaceWidth) {
//放大
let width = rect.surfaceWidth * 3
let height = rect.surfaceHeight * 3

let offsetX = (width - orange.surfaceWidth) / 2
let offsetY = (height - orange.surfaceHeight) / 2

this.controller.setXComponentSurfaceRect({
offsetX: -offsetX,
offsetY: -offsetY,
surfaceWidth: width,
surfaceHeight: height
})

} else {
//缩小
this.controller.setXComponentSurfaceRect({
offsetX: orange.offsetX,
offsetY: orange.offsetY,
surfaceWidth: orange.surfaceWidth,
surfaceHeight: orange.surfaceHeight
})
}
}

TLogUtils.debug(‘TapGesture event=’ + JSON.stringify(event))
}),
PanGesture()
.onActionStart((event) => {
//Pan手势识别成功回调。
TLogUtils.debug(‘TapGesture PanGesture start=’ + JSON.stringify(event))

this.lastOffsetX = event.offsetX
this.lastOffsetY = event.offsetY
if (event.scale === 1) {
//移动
this.surfaceOffset(event.offsetX, event.offsetY)
}
})
.onActionUpdate((event) => {
//Pan手势移动过程中回调。
TLogUtils.debug(‘TapGesture PanGesture update=’ + JSON.stringify(event))
if (event.scale === 1) {
//移动
this.surfaceOffset(event.offsetX - this.lastOffsetX, event.offsetY - this.lastOffsetY)
}
this.lastOffsetX = event.offsetX
this.lastOffsetY = event.offsetY

})
.onActionEnd((event) => {
//Pan手势识别成功,手指抬起后触发回调。
})
.onActionCancel(() => {
//Pan手势识别成功,接收到触摸取消事件触发回调。
}),

PinchGesture()
.onActionStart((event) => {
//Pan手势识别成功回调。
TLogUtils.debug(‘TapGesture PinchGesture start=’ + JSON.stringify(event))

this.lastScale = event.scale

})
.onActionUpdate((event) => {
//Pan手势移动过程中回调。
TLogUtils.debug(‘TapGesture PinchGesture update=’ + JSON.stringify(event))

//缩放
this.surfaceScale(event.scale - this.lastScale)

this.lastScale = event.scale

})
.onActionEnd((event) => {
//Pan手势识别成功,手指抬起后触发回调。
this.surfaceScaleEnd()
})
.onActionCancel(() => {
//Pan手势识别成功,接收到触摸取消事件触发回调。
this.surfaceScaleEnd()
}),
TapGesture()
.onAction((event) => {
this.onClickListener?.()
})
)
)
.onSizeChange((oldSize, newSize) => {
let height = newSize.height
let width = newSize.width
if (typeof height === ‘number’ && (typeof width === ‘number’)) {
let surfaceWidth = vp2px(width)
let surfaceHeight = vp2px(height)

this.orangeSurfaceRect = {
surfaceWidth: surfaceWidth,
surfaceHeight: surfaceHeight
}
this.controller.setXComponentSurfaceRect(this.orangeSurfaceRect)
this.currentScale = 1

}
})


}

1 回复

针对HarmonyOS 鸿蒙Next手势失效的问题,这可能是由于多种因素引起的。首先,确保你的鸿蒙Next系统为最新版本,因为老版本可能存在未修复的bug。以下是一些排查和解决手势失效问题的步骤:

  1. 检查手势设置:确认手势功能是否已在系统设置中启用,并检查是否有任何手势被禁用或冲突。
  2. 应用兼容性:某些应用可能未完全适配鸿蒙Next系统,导致手势无法正常工作。尝试在鸿蒙系统的原生应用中使用手势,以确定问题是否与应用相关。
  3. 系统缓存:系统缓存可能导致手势响应不灵敏或失效。尝试重启设备或清理系统缓存以查看问题是否得到解决。
  4. 硬件问题:屏幕或触摸传感器故障也可能导致手势失效。检查设备是否有物理损坏或触摸异常。

如果以上步骤未能解决问题,可能是由于更复杂的系统或硬件故障引起的。在这种情况下,建议直接联系设备制造商或访问其官方网站以获取进一步的技术支持。官网客服地址是:https://www.itying.com/category-93-b0.html ,他们将能够提供更具体的帮助和指导。

回到顶部