如何使用GestureDetector的onForcePress属性?

问题描述

我正在尝试使用onForcePress属性,例如Flutter中onForcePressstart小部件的onForcePressUpdateGestureDetector等,但是当我触摸屏幕时,它们并不会触发回调(尽我所能或尽可能地勇敢)。我以前用onPanStartonPanUpdate等实现了我本来相同的代码,并且按预期方式工作,只是没有访问我想要的压力信息。

似乎没有调用GestureForcePress回调的最小工作示例:

import 'package:Flutter/material.dart';

void main() {
  runApp(App());
}

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        print('onTap triggered');
      },//      onPanStart: (details) {
//        print('onPanStart triggered with ' + details.toString());
//      },//      onPanUpdate: (details) {
//        print('onPanUpdate triggered with ' + details.toString());
//      },onForcePressstart: (details) {
        print('onForcePressstart triggered with ' + details.toString());
      },onForcePressUpdate: (details) {
        print('onForcePressUpdate triggered with ' + details.toString());
      },child: Container(
        color: Colors.red,),);
  }
}

我知道,如果压力小于startPressure,则GestureDetector小部件的压力小于startPressure认为0到1)为0.4时,它们不应触发。 (我也想知道如何编辑此{{1}}属性,但会作为一个单独的问题提出。)

我正在测试的设备是galaxy Note 10+,可以轻松向其他应用提供压力信息。

解决方法

将问题的起源追溯到force_press.dart中的addAllowedPointer(PointerEvent event)方法,

@override
void addAllowedPointer(PointerEvent event) {
  // If the device has a maximum pressure of less than or equal to 1,it
  // doesn't have touch pressure sensing capabilities. Do not participate
  // in the gesture arena.
  if (event is! PointerUpEvent && event.pressureMax <= 1.0) {
      resolve(GestureDisposition.rejected);
  } else {
      // code for adding ForcePress pointer
  }

评论指出没有压力感测功能的设备的最大压力为

我在force_press.dart中将其更改为

@override
void addAllowedPointer(PointerEvent event) {
  // If the device has a maximum pressure of less than or equal to 1,it
  // doesn't have touch pressure sensing capabilities. Do not participate
  // in the gesture arena.
  if (event is! PointerUpEvent && event.pressureMax == event.pressureMin) {
      resolve(GestureDisposition.rejected);
  } else {
      // code for adding ForcePress pointer
  }
正如在整个PointerEvent文档中所述,不具有压力感测功能的设备应具有pressureMin = 1.0pressureMax = 1.0,并且具有压力感测功能且pressureMin = 1.0,pressureMax = 1.0的设备应为{p与我无法想到的所有用例中都无法区分的,所以这对我来说很有意义。

对我来说,类似的PointerEvents似乎对压力不敏感,仅在其PointerDataPackets中返回1.0的压力,返回0.0的pressureMin和1.0的pressureMax,并因此触发onForcePress回调,从而击败了onPan在手势舞台上。我不介意,因为我只遇到过压力= 1.0的ForcePresses与没有压力数据的onPan等效的情况,但这对于将来遇到此问题的人来说可能是个问题?

我认为,最终,非压力敏感的触摸事件应以pressureMin = 1.0进行注册,正如文档中指出的那样,但是我还没有弄清楚如何实现这一点。