HarmonyOS 鸿蒙Next 关于拖拽固定到指定位置的需求 求大佬指点

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

HarmonyOS 鸿蒙Next 关于拖拽固定到指定位置的需求 求大佬指点

就是我有这样一个需求,在拖动下方的小方块到红色区域后,松开手能固定到当前位置,有没有大佬来指点一下

cke_2099.png


更多关于HarmonyOS 鸿蒙Next 关于拖拽固定到指定位置的需求 求大佬指点的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

13 回复

 进行优化:

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


大佬 又要麻烦您 我发现你用的api版本太高了 我现在是是做的openharmony的应用,公司还在用api9 然后那个截图的api我用不了

找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) =&gt; item + index))
      .each((repeat) =&gt; {
        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中拖拽固定到指定位置的需求,以下是一些关键步骤和注意事项:

  1. 拖拽框架基础:确保你了解鸿蒙系统的拖拽框架,它允许通过鼠标或手势触屏传递数据。需要设置draggable属性为true的组件才能被拖拽,或者在组件上设置onDragStart回调函数。

  2. 拖拽事件处理

    • onDragStart:拖拽开始时触发,可用于初始化拖拽数据。
    • onDragMove:拖拽过程中持续触发,可用于更新拖拽位置和显示背板图。
    • onDrop:拖拽结束时触发,可用于处理拖拽数据并更新UI。
  3. 位置固定逻辑

    • 在onDragMove中记录拖拽过程中的位置变化。
    • 在onDrop中,根据记录的位置变化和目标位置,计算并更新组件的最终位置。
  4. 注意事项

    • 拖拽过程中可能需要处理边界条件,如防止组件拖出屏幕外。
    • 拖拽背板图可以自定义,以提供更好的用户体验。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部