问题描述
我正在尝试使用onForcePress属性,例如Flutter中onForcePressstart
小部件的onForcePressUpdate
,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
小部件的压力小于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.0和pressureMax = 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进行注册,正如文档中指出的那样,但是我还没有弄清楚如何实现这一点。