gpt4 book ai didi

android - 底层 PinchArea 从 MultiPointTouchArea 窃取事件

转载 作者:行者123 更新时间:2023-11-29 01:13:06 27 4
gpt4 key购买 nike

我想实现一个屏幕控制按钮,按下它可以作为 GUI 交互的修饰符。

这对于 MouseArea 是不可能的,因为该 API 只能处理一个鼠标区域中的一个触摸点。

该限制不适用于 MultiPointTouchArea - 您可以拥有多个并同时与它们交互。

在我的场景中,有一个控制按钮,通过 MultiPointTouchArea 实现,位于 PinchArea 内的 Flickable 之上。后者用于缩放 View ,这是通过 Flickable 实现的。

但是,我遇到了这种安排的问题,如果按下控制按钮,我将无法与轻弹交互,按下按钮时将一根手指放在它上面会开始捏合手势。这很奇怪,预期的是捏合仅在其区域内有两个触摸点时才开始。出于某种原因,即使最初触摸被注册为按钮的事件,但当一个触摸点在捏合区域中变为 Activity 状态时,按钮触摸点将被计为在捏合区域中。

请注意,如果没有轻弹区域或捏合区域,则不会发生这种情况,两者都必须存在于该配置中。如果它只是轻弹区域或捏合区域,覆盖按钮会按预期工作。此外,即使按钮位于捏合区域之前,问题也会出现。

这是重现问题的代码:

import QtQuick 2.7
import QtQuick.Window 2.2

Window {
id: main
visible: true
width: 1920
height: 1080

PinchArea {
anchors.fill: parent
onPinchUpdated: tt.text = pinch.scale
pinch.target: rect
Flickable {
contentWidth: 2000
contentHeight: 2000
anchors.fill: parent
Rectangle {
id: rect
width: 200
height: 200
color: "green"
x: 500
y: 300
}
}
}

Text {
anchors.centerIn: parent
id: tt
}

Rectangle {
width: 200
height: 200
anchors.verticalCenter: parent.verticalCenter
color: "blue"
MultiPointTouchArea {
anchors.fill: parent
minimumTouchPoints: 1
maximumTouchPoints: 1
onPressed: parent.color = "red"
onReleased: parent.color = "blue"
}
}
}

请注意,如果您在按下按钮时触摸 flickable,则会触发捏合区域,并且在释放按钮时其颜色不会改变,即不会发出释放信号,事件实际上已从中窃取捏区,即使后者在后面也不应该干涉。唉,在这种情况下没有 preventStealing 选项。

此时这看起来像 yet another Qt bug , 但非常感谢有关如何解决该问题的建议。

最佳答案

经过几个小时的调查,这似乎确实是一个错误或至少是一个重要的设计限制。无论如何,我都无法让重叠的触摸区域同时工作,即使它们没有重叠或嵌套,这种行为也很笨拙,因为在不同区域之间注册了虚假的触摸点。

幸运的是,在我的例子中,我能够通过避免重叠来解决这个问题——我将捏合区域向右轻推,而底层的轻弹仍然通过在负 x 轴上偏移来有效地填充屏幕:

import QtQuick 2.7
import QtQuick.Window 2.2

Window {
id: main
visible: true
width: 1920
height: 1080

PinchArea {
height: parent.height //
x: btn.width //
width: parent.width - x //
Flickable {
contentWidth: 2000
contentHeight: 2000
height: parent.height //
width: main.width //
x: -btn.x //
Rectangle {
id: rect
width: 200
height: 200
color: "green"
x: 500
y: 300
}
}
}

Text {
anchors.centerIn: parent
id: tt
}

Rectangle {
id: btn
width: 200
height: 200
anchors.verticalCenter: parent.verticalCenter
color: "blue"
MultiPointTouchArea {
anchors.fill: parent
minimumTouchPoints: 1
maximumTouchPoints: 1
onPressed: parent.color = "red"
onReleased: parent.color = "blue"
}
}
}

但是,如果您的情况要求同时使用重叠的触摸区域,那么在错误得到解决之前您似乎不太走运。

关于android - 底层 PinchArea 从 MultiPointTouchArea 窃取事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41664745/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com