HarmonyOS 鸿蒙Next组件移动
HarmonyOS 鸿蒙Next组件移动
组件移动可以通过ontouch事件实现吗,具体的逻辑是怎样的,目前使用拖拽事件,它开始的响应时间太长了
5 回复
import display from '@ohos.display';
import { promptAction } from '@kit.ArkUI';
import { ResManager } from '@ohos/source';
let displayClass: display.Display | null = null
try {
displayClass = display.getDefaultDisplaySync()
} catch (exception) {
console.error("wy" + JSON.stringify(exception))
}
/**
* 可拖动的Imageview, 默认位置x方向上的值为0时可以不用传入值,否则需要传入positionX的值
* */
@Component
export struct FloatImage {
//初始位置
@State offsetX: number = 0
@State offsetY: number = 0
//拖动偏移量
@State positionX: number = 0
@State positionY: number = 0
screenWidth: number | undefined = displayClass?.width
density: number | undefined = displayClass?.densityPixels
@State imageWidth: number = 50
@State imageHeight: number = 50
@State imageResource: Resource | string = ResManager.getLauncherIcon()
build() {
Stack() {
Image(this.imageResource)
.width(this.imageWidth)
.height(this.imageHeight)
.gesture(
PanGesture()
.onActionStart((event: GestureEvent | undefined) => {
if (event) {
}
})
.onActionUpdate((event: GestureEvent | undefined) => {
if (event) {
this.offsetX = this.positionX + event.offsetX
this.offsetY = this.positionY + event.offsetY
}
})
.onActionEnd((event: GestureEvent | undefined) => {
if (event) {
if (this.density != undefined
&& this.screenWidth != undefined
&& this.offsetX > this.screenWidth / (2 * this.density)) {
this.positionX = this.screenWidth / this.density - this.imageWidth
} else {
this.positionX = 0
}
this.positionY = this.offsetY
//拖动结束后自动靠边,拖动距离小于屏幕一半时靠左,大于一半时靠右
animateTo({
duration: 500,
delay: 50,
}, () => {
//注:由于动画和偏移量计算都是vp值,需要把屏幕宽度进行转换成vp
if (this.density != undefined
&& this.screenWidth != undefined
&& this.offsetX > this.screenWidth / (2 * this.density)) {
this.offsetX = this.screenWidth / this.density - this.imageWidth
} else {
this.offsetX = 0
}
})
}
})
)
.translate({ x: this.offsetX, y: this.offsetY, z: 0 })
}
}
}
可以用手势事件实现,参考我们项目的可拖动图片组件
还想再请假一下是否可以实现类似拖拽,移动的时候原来位置的组件不变
手势是通用属性,理论上都可以
针对HarmonyOS鸿蒙Next组件移动的问题,这通常涉及到UI组件的动态布局调整。在鸿蒙系统中,可以通过多种方式实现组件的移动,包括但不限于:
- 监听滑动事件:通过监听滑动事件(如onScroll),在回调中动态调整组件的位置属性,如top、left等,以实现组件的移动效果。
- 使用动画API:鸿蒙系统提供了丰富的动画API,可以创建平滑的位移效果。开发者可以利用这些API来设置组件的移动动画,从而实现更生动的组件移动效果。
- 调整组件布局:在组件布局上,可以通过修改组件的宽高、边距等属性来调整其位置。特别是在使用Grid、Row、Column等布局容器时,合理设置这些属性可以有效控制组件的移动。
此外,对于列表滑动时组件位移的问题,可能是由于Grid高度变化导致Item高度变化,进而渲染效果出现跳动。此时,可以尝试在Grid组件上不设置高度,而是加上maxCount属性,以实现Grid高度自适应的效果,从而避免item渲染跳动。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html