如何使用 GestureDetector 的 onForcePress 属性?
Posted
技术标签:
【中文标题】如何使用 GestureDetector 的 onForcePress 属性?【英文标题】:How to use GestureDetector's onForcePress properties? 【发布时间】:2020-12-12 04:37:35 【问题描述】:我正在尝试使用 onForcePress 属性,例如onForcePressStart
、onForcePressUpdate
等 Flutter 中的 GestureDetector
小部件,但是当我触摸屏幕时它们不会触发它们的回调(尽可能轻或尽可能有力)。我之前使用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 到 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进行手势检测