Android 底层PinchArea从MultiPointTouchArea窃取事件
我想实现一个屏幕上的控制按钮,它可以被按下作为GUI交互的修改器 这对于Android 底层PinchArea从MultiPointTouchArea窃取事件,android,qt,qml,multi-touch,event-propagation,Android,Qt,Qml,Multi Touch,Event Propagation,我想实现一个屏幕上的控制按钮,它可以被按下作为GUI交互的修改器 这对于MouseArea是不可能的,因为该API只能处理一个鼠标区域中的一个触摸点 该限制不适用于多点接触区域——您可以拥有多个多点接触区域并同时与它们交互 在我的场景中,在PinchArea内部的Flickable上,有一个控制按钮,通过多点触摸区域实现。后者用于缩放视图,这是通过Flickable实现的 然而,我遇到了这样一个问题:如果按下控制按钮,我将无法与flickable交互,在按下按钮的同时将一根手指放在上面,开始一个
MouseArea
是不可能的,因为该API只能处理一个鼠标区域中的一个触摸点
该限制不适用于多点接触区域
——您可以拥有多个多点接触区域并同时与它们交互
在我的场景中,在PinchArea
内部的Flickable
上,有一个控制按钮,通过多点触摸区域实现。后者用于缩放视图,这是通过Flickable
实现的
然而,我遇到了这样一个问题:如果按下控制按钮,我将无法与flickable交互,在按下按钮的同时将一根手指放在上面,开始一个捏手势。这很奇怪,我们所期望的是,只有在其区域内有两个接触点时才会开始挤压。出于某种原因,即使最初触摸被记录为按钮的事件,但当一个触摸点在按压区域中激活时,按钮触摸点被视为处于按压区域
请注意,如果没有flickable或pinch区域,这两种配置都必须存在。如果只是flickable或pinch区域,则overlay按钮按预期工作。此外,即使按钮位于夹点区域之前,问题也会出现
以下是重现问题的代码:
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,则会触发夹点区域,释放按钮时,其颜色不会改变,即不会发出其释放的信号,夹点区域会有效地窃取事件,即使后者在后面,也不应干扰。唉,在这个场景中没有选项
在这一点上,这看起来像是一个问题,但是对于如何解决这个问题的建议,我们将不胜感激。在对这个问题进行了几个小时的调查之后,似乎这确实是一个bug的案例,或者至少是一个重大的设计限制。无论发生什么情况,我都无法让重叠的触摸区域同时工作,即使它们没有重叠或嵌套,行为也很笨拙,不同区域之间注册了虚假的触摸点
幸运的是,在我的例子中,我能够通过避免重叠来解决这个问题-我将收缩区域推到右侧,而底层flickable仍然通过在负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"
}
}
}
但是,如果您的案例要求同时使用重叠的触摸区域,则在故障得到解决之前,您似乎运气不佳