flutter - 如何使用 GestureDetector 的 onForcePress 属性?

标签 flutter flutter-layout gesturedetector

我正在尝试使用 onForcePress 属性,例如onForcePressStart , onForcePressUpdate GestureDetector 等Flutter 中的小部件,但是当我触摸屏幕时,它们不会触发回调(尽可能轻巧或尽可能用力)。我之前用 onPanStart 实现了我原本相同的代码, onPanUpdate等等,它按预期工作,只是无法访问我想要的压力信息。
似乎没有调用 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,默认情况下是 0.4,在 0 到 1 的范围内小部件。 (我也想知道如何编辑这个 startPressure 属性,但会作为一个单独的问题提出来。)
我正在测试的设备是 Galaxy Note 10+,它可以轻松地向其他应用程序提供压力信息。

最佳答案

追根溯源到addAllowedPointer(PointerEvent event) 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 <= 1.0) {
      resolve(GestureDisposition.rejected);
  } else {
      // code for adding ForcePress pointer
  }
声明没有压力感应功能的设备的最大压力 <= 1 的评论是不正确的,我的压力感应设备的最大压力为 1.0(通过检查 PointerDataPackets 发现,在调试时压力首先出现在堆栈中)。
我在 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 ,并且具有压力传感功能且压力最小 = 1.0、压力最大 = 1.0 的设备与在我能想到的所有用例中都没有的设备无法区分,所以这对我来说很有意义。
对我来说,PointerEvents of kind touch,似乎对压力不敏感,只在它们的 PointerDataPackets 中返回 1.0 的压力,返回 0.0 的 pressureMin 和 1.0 的 pressureMax,因此触发 onForcePress 回调,在手势中击败 onPan竞技场。我不介意这一点,因为我只遇到过压力 = 1.0 的 ForcePresses 与没有压力数据的 onPans 表现相同的情况,但这对于将来遇到这种情况的人来说可能是一个问题?
我认为,最终,非压力敏感的触摸事件应该注册为 pressureMin = 1.0,正如文档所述,但我还没有弄清楚如何实现这一点。

关于flutter - 如何使用 GestureDetector 的 onForcePress 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63545774/

相关文章:

flutter - 如何将图像适合作为状态栏的背景?

flutter - 如何在 flutter 中制作字体系列后备?

flutter - 如何去除ios上的过度滚动?

navigation - 在 Flutter 中将 GestureDector 添加到 Listview.builder 卡的正确方法?

height - Flutter 垂直分隔线与其父级一样高

flutter - 什么是NoSuchMethod错误,如何解决?

flutter - 如何使用 Map<DateTime, List<Event>> 添加新对(事件是随机类)?

java - GestureDetector 不适用于新布局

android - 无法通过 ListView 检测手势

flutter - 从深色主题切换到浅色主题的按钮