HarmonyOS鸿蒙Next中这个文档上面的拖拽为什么响应这么慢

HarmonyOS鸿蒙Next中这个文档上面的拖拽为什么响应这么慢 https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-arkui-dragcontroller#%E5%AF%BC%E5%85%A5%E6%A8%A1%E5%9D%97

https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-uicontext-dragcontroller

这个文档上面的拖拽为什么响应这么慢,有延迟

设备版本:5.1

import { unifiedDataChannel } from '@kit.ArkData';
import { dragController } from '@kit.ArkUI';

@Entry
@ComponentV2
struct Test {
  build() {
    Row() {
      Text("DraggingBuilder")
        .fontColor(Color.White)
        .fontSize(12)
    }
    .width(100)
    .height(100)
    .backgroundColor("#ccc")
    

    .onTouch((event?: TouchEvent) => {

      if (event && event.sourceTool === SourceTool.Finger) {
        if (event.type === TouchType.Down) {
          this.startDrag(event);
        }

      }
    })
  }

  //开始拖动
  startDrag(event: TouchEvent) {


    let text = new unifiedDataChannel.PlainText()
    text.textContent = "123";
    text.abstract = 'abstract'

    let unifiedData = new unifiedDataChannel.UnifiedData(text)

    let dragInfo: dragController.DragInfo = {
      pointerId: 0,
      data: unifiedData,
      extraParams: '',
    }
    let eve: DragInfo = new DragInfo();

    this.getUIContext().getDragController().executeDrag(() => {
      this.DraggingBuilder()
    }, dragInfo)
  }

  @Builder
  DraggingBuilder() {
    Column() {
      // Text("DraggingBuilder")
      //   .fontColor(Color.White)
      //   .fontSize(12)
    }
    .width(192 / 2)
    .height(108 / 2)
    .backgroundColor("#ffcf0a0a")

  }
}

class DragInfo {
  event: DragEvent | undefined = undefined;
  extraParams: string = '';
}

更多关于HarmonyOS鸿蒙Next中这个文档上面的拖拽为什么响应这么慢的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

您好,这边使用6.0.0.112版本的设备没有延迟,您可以升级下系统版本

更多关于HarmonyOS鸿蒙Next中这个文档上面的拖拽为什么响应这么慢的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


您好,这个是属于系统bug吗?假如手机不升级,不能解决这个问题吗?

5.1的设备是有延迟

在6.0.0.130的设备上测试没有延迟,应该是系统问题

鸿蒙Next文档拖拽响应慢可能由以下原因导致:

  1. 系统资源占用过高,CPU或内存负载大;
  2. 应用优化不足,渲染性能或事件处理机制待改进;
  3. 文档内容复杂,元素过多影响交互流畅度。 可检查系统资源使用情况,并关注鸿蒙官方后续版本更新优化。

拖拽响应延迟通常与 executeDrag 的调用时机和拖拽数据初始化开销有关。从你的代码看,主要问题可能出在 onTouch 事件处理和 startDrag 方法内的对象创建过程。

关键点分析:

  1. onTouch 触发时机TouchType.Down 触发后,系统需要等待一个极短的时间来区分是点击还是拖拽(防误触),这可能导致初始延迟感。这是预期行为。
  2. 同步初始化开销:你在 startDrag 中同步创建了 PlainTextUnifiedDataDragInfo 对象。如果 UnifiedData 结构复杂或数据较大,在主线程进行这些操作会阻塞手势响应的连续性。
  3. executeDrag 调用executeDrag 方法本身会等待拖拽手势被正式识别(如微小移动)后才启动拖拽视图(DraggingBuilder),这也会增加感知延迟。

优化建议:

  • 预初始化数据:如果拖拽数据是固定的或可预测的,考虑在组件初始化时(如 aboutToAppear)提前创建 unifiedDatadragInfo,避免在触摸事件中实时创建。
  • 简化 Builder:确保 DraggingBuilder 中的内容尽可能轻量。你当前的 Builder 是空的,这很好。
  • 检查设备性能:在真机(而非模拟器)上测试,并确保设备没有处于低功耗模式或过热降频。

代码调整示例(预初始化数据):

import { unifiedDataChannel } from '@kit.ArkData';
import { dragController } from '@kit.ArkUI';

@Entry
@ComponentV2
struct Test {
  private unifiedData: unifiedDataChannel.UnifiedData | null = null;
  private dragInfo: dragController.DragInfo | null = null;

  aboutToAppear() {
    // 提前初始化拖拽数据
    let text = new unifiedDataChannel.PlainText();
    text.textContent = "123";
    text.abstract = 'abstract';
    this.unifiedData = new unifiedDataChannel.UnifiedData(text);

    this.dragInfo = {
      pointerId: 0,
      data: this.unifiedData,
      extraParams: '',
    };
  }

  build() {
    Row() {
      Text("DraggingBuilder")
        .fontColor(Color.White)
        .fontSize(12)
    }
    .width(100)
    .height(100)
    .backgroundColor("#ccc")
    .onTouch((event?: TouchEvent) => {
      if (event && event.sourceTool === SourceTool.Finger) {
        if (event.type === TouchType.Down) {
          this.startDrag(event);
        }
      }
    })
  }

  startDrag(event: TouchEvent) {
    if (!this.dragInfo) {
      return;
    }
    // 直接使用预初始化的 dragInfo,并更新 pointerId
    this.dragInfo.pointerId = event.touches[0].fingerId; // 使用正确的 fingerId
    this.getUIContext().getDragController().executeDrag(() => {
      this.DraggingBuilder()
    }, this.dragInfo)
  }

  @Builder
  DraggingBuilder() {
    Column() {
      // 保持内容轻量
    }
    .width(192 / 2)
    .height(108 / 2)
    .backgroundColor("#ffcf0a0a")
  }
}

其他可能性:

  • 系统版本:你提到的设备版本 5.1 是 HarmonyOS 的 API 版本。请确保 SDK 和文档版本与设备系统版本匹配。
  • 手势冲突:检查页面其他区域是否有其他手势识别器(如 PanGesture)可能产生了干扰。

通过预初始化拖拽数据,可以减少 onTouch 到拖拽视图出现之间的处理时间,从而提升响应速度。如果问题依旧,建议在更高性能的设备上对比测试,或检查是否有其他后台任务影响了主线程响应。

回到顶部