【发布时间】:2020-11-11 10:26:08
【问题描述】:
某些手机,尤其是三星 Galaxy Note 系列设备,具有可以在靠近屏幕但不触摸屏幕时检测到的触控笔(触控笔?)。 Flutter 可以检测和处理这种事件吗?
(以下是我对此的调查,如果你已经知道答案,请随意跳过这个????)
Listener 类可以检测触控笔在触摸屏幕时执行的操作,MouseRegion 类应该检测使用悬停指针执行的操作。所以我写了这个简单的小部件来测试这两个类:
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String _message = "Nothing happened";
String _location = "Nothing happened";
void onEnter(PointerEnterEvent event) {
setState(() {
_message = "Pointer entered";
});
}
void onExit(PointerExitEvent event) {
setState(() {
_message = "Pointer exited";
});
}
void onHover(PointerHoverEvent event) {
setState(() {
_location = "Pointer at ${event.localPosition.dx} ${event.localPosition.dy} distance ${event.distance}";
});
}
void onDown(PointerDownEvent event) {
setState(() {
_message = "Pointer down";
});
}
void onUp(PointerUpEvent event) {
setState(() {
_message = "Pointer up";
});
}
void onMove(PointerMoveEvent event) {
setState(() {
_location = "Pointer moving at ${event.localPosition.dx} ${event.localPosition.dy} pressure ${event.pressure}";
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
children: [
MouseRegion(
onEnter: onEnter,
onExit: onExit,
onHover: onHover,
child: Listener(
onPointerDown: onDown,
onPointerUp: onUp,
onPointerMove: onMove,
child: Container(
width: 500,
height: 500,
color: Colors.red
)
)
),
Text(_message),
Text(_location)
]
)
),
);
}
}
使用蓝牙鼠标,当我将指针移到该区域上时,MouseRegion 小部件会发出事件,但当我使用触控笔执行相同操作时,什么也没有发生。
然而,Listener 类会在我用触控笔触摸 区域时发出事件,并且事件实例甚至包括特定于触控笔的信息,例如压力。 PointerEvent 类甚至包含一个 distance 字段,根据它的描述,它应该指示从指针到屏幕的距离,这似乎正是我正在寻找的功能。
This comment 表示 Flutter“还没有准备好”支持可悬停的手写笔,但他似乎并不完全确定这一点,而且它是在一年前发布的,所以也许有些改变了。
最后,当我在运行应用程序时将触控笔悬停在屏幕上时,Android Studio 的控制台上会显示以下消息:
D/ViewRootImpl(16531): updatePointerIcon pointerType = 20001, calling pid = 16531
D/InputManager(16531): setPointerIconType iconId = 20001, callingPid = 16531
所以它似乎确实检测到了一些东西。在我看来,Flutter 正在积极丢弃与手写笔相关的事件,只处理鼠标事件,因为在本机端,鼠标和笔操作都可以由 MotionEvent 类处理。
我错过了什么吗?是否有其他类能够处理这种事件?或者在某处启用它的一些设置?还是目前真的不行?
【问题讨论】: