[经验分享] 【FAQ问题定位】(ARK)“触屏+触屏”hap内文本内容拖拽失败的问题分析 原创

诚迈_雨哥 显示全部楼层 发表于 2023-12-6 18:16:03
触屏+触屏 HAP内文本内容拖拽问题定位
1. 问题描述
“触屏+触屏”HAP 内容拖拽问题是指第一个手指发起拖拽,第二个手指点击新位置,看不见cursor光标,抬起第一个手指,结果被拖拽内容原地不动。我们分阶段进行分析,先看看单手指拖拽文本内容到新位置是否能成功?首先打开”备忘录”“蛋糕做法”文档,单指选中内容,长按进行拖拽,到达指定位置,抬起手指,问题来了。既不显示cursor光标位置,也拖拽不了内容到达新位置。
2. 分析问题
经过一番折腾,发现将内容拖拽到HAP顶部,然后再进来,就显示光标了,当抬起手指,内容刚好拖拽到此处。于是比较到达顶部的日志:
图片1.png


发现拖拽到顶部,准确说离开了编辑区,执行了一个拖拽离开操作如①所示,再进来到文本首行执行了②,光标就显示了,抬起手指,拖拽成功。是不是只有从顶部离开、进入功能才正常?接着做了如下一个测试,从左右拖拽离开再进入,结果也会显示光标,拖拽也能成功。

为什么再次进入才能拖拽成功?是不是,进入后改变了什么状态,又比较了成功与失败的日志,发现抬起后,失败的 isDragging_ false,如下图红框①所示:

log 图2

log 图2
图片3.png

离开再进入时将 isDragging_ 设置为true, 如绿框②所示。发起拖拽后谁修改了 isDragging_ 标志?日志中出现蓝色框③的操作,即就是取消拖拽操作,把isDragging_ 设置成了false

查看代码,TouchTest时收集拖拽actutor时,在drag_event.cpp中执行了如下操作,被屏蔽的部分:

至此,存留两个疑问,1.单手拖拽(单焦点时)为什么在成功发起拖拽之后,取消拖拽操作(应该在发起拖拽之前,取消之前的拖拽操作),这就造成web_pattern.cpp 中的isDragging_ 状态混乱。 2.一旦执行了取消操作,另外一个焦点发起 TouchTest后会将之前的拖拽操作取消掉,这不是我们期望的。

干脆注释掉这两行,单手拖拽文本内容成功。

3. 深挖问题
现在转到“触屏+触屏”HAP 内容拖拽。第一个手指发起拖拽,第二个手指点击新位置,看不见cursor光标,抬起第一个手指,结果被拖拽内容原地不动。
又测试了“触屏+鼠标”HAP 内容拖拽。一个手指发起拖拽,鼠标点击新位置,看见cursor光标,抬起手指,结果被拖拽内容原地不动。通过日志发现在web_pattern.cpp中,虽然还在拖拽框架发起拖拽的过程中,只有第二个手指或者鼠标抬起就会调用ResetDragAction()将 isDragging_ 设置为false, 并执行一系列取消拖拽操作.

void WebPattern::ResetDragAction()
{
    auto frameNode = GetHost();
    frameNode->SetDraggable(false);
    auto eventHub = frameNode->GetEventHub<WebEventHub>();
    auto gestureHub = eventHub->GetOrCreateGestureEventHub();
    gestureHub->ResetDragActionForWeb();

    if (!isDragging_) {
        return;
    }
    isDragging_ = false;
    LOGI("need to cancel web kernel drag action");
    // cancel drag action to avoid web kernel can't process other input event
    delegate_->HandleDragEvent(0, 0, DragAction:RAG_CANCEL);
    gestureHub->CancelDragForWeb();
}


  if (info.GetButton() == MouseButton:EFT_BUTTON && info.GetAction() == MouseAction::RELEASE) {
        ResetDragAction();
    }

void WebPattern::HandleTouchUp(const TouchEventInfo& info, bool fromOverlay)
{
ResetDragAction();
......
}

4. 结论
1. web_pattern.cpp 仅适合单焦点操作;
2. isDragging_ 和拖拽框架中 发起拖拽为True,结束拖拽为 False状态存在差异;

©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部