Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 底层PinchArea从MultiPointTouchArea窃取事件_Android_Qt_Qml_Multi Touch_Event Propagation - Fatal编程技术网

Android 底层PinchArea从MultiPointTouchArea窃取事件

Android 底层PinchArea从MultiPointTouchArea窃取事件,android,qt,qml,multi-touch,event-propagation,Android,Qt,Qml,Multi Touch,Event Propagation,我想实现一个屏幕上的控制按钮,它可以被按下作为GUI交互的修改器 这对于MouseArea是不可能的,因为该API只能处理一个鼠标区域中的一个触摸点 该限制不适用于多点接触区域——您可以拥有多个多点接触区域并同时与它们交互 在我的场景中,在PinchArea内部的Flickable上,有一个控制按钮,通过多点触摸区域实现。后者用于缩放视图,这是通过Flickable实现的 然而,我遇到了这样一个问题:如果按下控制按钮,我将无法与flickable交互,在按下按钮的同时将一根手指放在上面,开始一个

我想实现一个屏幕上的控制按钮,它可以被按下作为GUI交互的修改器

这对于
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"
    }
  }
}
但是,如果您的案例要求同时使用重叠的触摸区域,则在故障得到解决之前,您似乎运气不佳