HarmonyOS 鸿蒙Next 关于拖拽固定到指定位置的需求 求大佬指点
HarmonyOS 鸿蒙Next 关于拖拽固定到指定位置的需求 求大佬指点
就是我有这样一个需求,在拖动下方的小方块到红色区域后,松开手能固定到当前位置,有没有大佬来指点一下
更多关于HarmonyOS 鸿蒙Next 关于拖拽固定到指定位置的需求 求大佬指点的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
进行优化:
1.利用截图实现替身
2.控制方块落点
import { componentSnapshot, componentUtils, curves } from '[@kit](/user/kit).ArkUI';
import { image } from '[@kit](/user/kit).ImageKit';
/**
* 可以拖动组件并限制活动范围
*/
[@Entry](/user/Entry)
[@Component](/user/Component)
struct GestureDemo {
build() {
Column({ space: 10 }) {
Row() {
}
.width(300)
.height(200)
.border({ color: Color.Red, width: 1 })
.id('redRow')
.backgroundColor(Color.White)
Row({ space: 5 }) {
Repeat(new Array(5).fill('0').map((item: string, index) => item + index))
.each((repeat) => {
GestureItem({ text: repeat.item, rangId: 'redRow' })
})
}
.width(300)
.height(60)
.border({ color: Color.Blue, width: 1 })
.padding(10)
}.alignItems(HorizontalAlign.Center)
.width("100%")
.height("100%")
}
}
[@Component](/user/Component)
export struct GestureItem {
[@State](/user/State) offsetX: number = 0;
[@State](/user/State) offsetY: number = 0;
[@State](/user/State) positionX: number = 0;
[@State](/user/State) positionY: number = 0;
[@Prop](/user/Prop) text: string
siz: number = 50
ratio: number = 1.2
// 控制范围
rangX: [number, number] = [0, 100]
rangY: [number, number] = [0, 100]
isGet: boolean = false
// 落点区域id
rangId: string = ''
// 替身
[@State](/user/State) pixmap: image.PixelMap | undefined = undefined
build() {
Stack() {
// 展示信息
Row() {
Text(this.text)
}
.border({ color: Color.Blue, width: 1 })
.backgroundColor(Color.Orange)
.id(this.text)
.width("100%")
.height("100%")
// 替身图片
Image(this.pixmap)
.width("100%")
.height("100%")
.translate({ x: this.offsetX, y: this.offsetY, z: 0 })
.animation({ curve: curves.springMotion() })
.gesture(
PanGesture()
.onActionStart(() => {
// 进行截图
componentSnapshot.get(this.text, (error: Error, pixmap: image.PixelMap) => {
this.pixmap = pixmap
}, { waitUntilRenderFinished: true })
// 获取范围信息
if (!this.isGet) {
let obj: componentUtils.ComponentInfo = componentUtils.getRectangleById(this.rangId);
let thisObj: componentUtils.ComponentInfo = componentUtils.getRectangleById(this.text);
this.rangX[0] = px2vp(obj.windowOffset.x - thisObj.windowOffset.x)
this.rangY[0] = px2vp(obj.windowOffset.y - thisObj.windowOffset.y)
this.rangX[1] = px2vp(obj.size.width - thisObj.windowOffset.x)
this.rangY[1] =
px2vp(obj.size.height + obj.windowOffset.y - thisObj.windowOffset.y - thisObj.size.height)
this.isGet = true
}
})
.onActionUpdate((event: GestureEvent | undefined) => {
if (event) {
this.offsetX = this.positionX + event.offsetX;
this.offsetY = this.positionY + event.offsetY;
}
})
.onActionEnd(() => {
// 根据范围进行落点
if (this.offsetX > this.rangX[0] && this.offsetX < this.rangX[1] &&
this.offsetY > this.rangY[0] && this.offsetY < this.rangY[1]
) {
this.positionX = this.offsetX;
this.positionY = this.offsetY;
} else {
this.offsetX = 0
this.offsetY = 0
this.positionX = 0
this.positionY = 0
}
})
)
}.width(this.siz)
.aspectRatio(this.ratio)
}
}
更多关于HarmonyOS 鸿蒙Next 关于拖拽固定到指定位置的需求 求大佬指点的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17
用不了截图可以将替身部分写成本体部分一样的就行
[@Entry](/user/Entry)
[@Component](/user/Component)
struct GestureDemo {
build() {
Column({ space: 10 }) {
Row() {
}.width(<span class="hljs-number"><span class="hljs-number">300</span></span>)
.height(<span class="hljs-number"><span class="hljs-number">200</span></span>)
.border({ color: Color.Red, width: <span class="hljs-number"><span class="hljs-number">1</span></span> })
Row({ space: <span class="hljs-number"><span class="hljs-number">5</span></span> }) {
Repeat(<span class="hljs-keyword"><span class="hljs-keyword">new</span></span> <span class="hljs-built_in"><span class="hljs-built_in">Array</span></span>(<span class="hljs-number"><span class="hljs-number">5</span></span>).fill(<span class="hljs-string"><span class="hljs-string">'0'</span></span>).map((item: string, index) => item + index))
.each((repeat) => {
GestureItem({ text: repeat.item})
})
}.width(<span class="hljs-number"><span class="hljs-number">300</span></span>)
.height(<span class="hljs-number"><span class="hljs-number">60</span></span>)
.border({ color: Color.Blue, width: <span class="hljs-number"><span class="hljs-number">1</span></span> })
.padding(<span class="hljs-number"><span class="hljs-number">10</span></span>)
}.alignItems(HorizontalAlign.Center)
.width(<span class="hljs-string"><span class="hljs-string">"100%"</span></span>)
.height(<span class="hljs-string"><span class="hljs-string">"100%"</span></span>)
}
}
@Component
export struct GestureItem {
@State offsetX: number = 0;
@State offsetY: number = 0;
@State positionX: number = 0;
@State positionY: number = 0;
text: string = ‘’
// 添加限制
// xRange: [number, number] = [-1, -1]
// yRange: [number, number] = [-1, -1]
siz: number = 50
ratio: number = 1.2
build() {
Row() {
Text(this.text)
}
.width(this.siz)
.aspectRatio(this.ratio)
.border({ color: Color.Blue, width: 1 })
.translate({ x: this.offsetX, y: this.offsetY, z: 0 })
.gesture(
PanGesture()// 当触发拖动手势时,根据回调函数修改组件的布局位置信息
.onActionUpdate((event: GestureEvent | undefined) => {
if (event) {
this.offsetX = this.positionX + event.offsetX;
this.offsetY = this.positionY + event.offsetY;
}
})
.onActionEnd(() => {
this.positionX = this.offsetX;
this.positionY = this.offsetY;
})
)
}
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html
大佬你的这个案例 可以固定住下面小方框的位置吗 等于说我拖出的是某个小方块的替身放到红色框内
我新开了一楼,你可以看一下
找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17
感谢大佬
我现在开发用的openharmony api9 好像用不了
针对HarmonyOS鸿蒙Next中拖拽固定到指定位置的需求,以下是一些关键步骤和注意事项:
-
拖拽框架基础:确保你了解鸿蒙系统的拖拽框架,它允许通过鼠标或手势触屏传递数据。需要设置draggable属性为true的组件才能被拖拽,或者在组件上设置onDragStart回调函数。
-
拖拽事件处理:
- onDragStart:拖拽开始时触发,可用于初始化拖拽数据。
- onDragMove:拖拽过程中持续触发,可用于更新拖拽位置和显示背板图。
- onDrop:拖拽结束时触发,可用于处理拖拽数据并更新UI。
-
位置固定逻辑:
- 在onDragMove中记录拖拽过程中的位置变化。
- 在onDrop中,根据记录的位置变化和目标位置,计算并更新组件的最终位置。
-
注意事项:
- 拖拽过程中可能需要处理边界条件,如防止组件拖出屏幕外。
- 拖拽背板图可以自定义,以提供更好的用户体验。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。