如何使用 GestureDetector 的 onForcePress 属性?

Posted

技术标签:

【中文标题】如何使用 GestureDetector 的 onForcePress 属性?【英文标题】:How to use GestureDetector's onForcePress properties? 【发布时间】:2020-12-12 04:37:35 【问题描述】:

我正在尝试使用 onForcePress 属性,例如onForcePressStartonForcePressUpdate 等 Flutter 中的 GestureDetector 小部件,但是当我触摸屏幕时它们不会触发它们的回调(尽可能轻或尽可能有力)。我之前使用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,
      ),
    );
  

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

我正在测试的设备是 Galaxy Note 10+,它可以很容易地向其他应用程序提供压力信息。

【问题讨论】:

【参考方案1】:

将问题的根源追溯到 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.0 和 pressureMax = 1.0,并且确实具有压力感应功能且 pressureMin = 1.0、pressureMax = 1.0 的设备与在我能想到的所有用例中都没有,所以这对我来说很有意义。

对我来说,PointerEvents 似乎对压力不敏感,在它们的 PointerDataPackets 中只返回 1.0 的压力,返回 0.0 的 pressureMin 和 1.0 的 pressureMax,因此触发了 onForcePress 回调,它击败了 onPan在手势领域。我不介意这一点,因为我只遇到过压力 = 1.0 的 ForcePresses 的行为与没有压力数据的 onPans 等效的情况,但这对于将来遇到这种情况的人来说可能是个问题?

我认为,最终,非压敏触摸事件应该使用 pressureMin = 1.0 注册,正如文档所述,但我还没有弄清楚如何实现这一点。

【讨论】:

以上是关于如何使用 GestureDetector 的 onForcePress 属性?的主要内容,如果未能解决你的问题,请参考以下文章

翩翩。如何使用GestureDetector让这个形状平滑旋转?

如何在 Flutter 中使用 GestureDetector 隐藏 appBar?

Android使用GestureDetector进行手势检测

Android使用GestureDetector进行手势检测

Android使用GestureDetector进行手势检测

Android_GestureDetector手势滑动使用