鼠标事件组件MouseRegion
MouseRegion
用来跟踪鼠标移动
void Function(PointerEnterEvent)? onEnter
:鼠标指针进入事件void Function(PointerExitEvent)? onExit
:鼠标指针离开事件void Function(PointerHoverEvent)? onHover
:鼠标指针进入而未按下时的事件MouseCursor cursor
: 更改鼠标样式。默认为MouseCursor.deferbool opaque
:是否应防止其后面的其他MouseRegion检测指针。默认为trueWidget? child
:子元素
我们先定义两个参数
String _message = '鼠标未进入';
Color _color = Colors.blue;
当鼠标指针进入MouseRegion组件时对他们进行更改
MouseRegion(
onEnter: (PointerEnterEvent e) {
setState(() {
_message = '鼠标进来了';
});
},
onExit: (PointerExitEvent e) {
setState(() {
_message = '鼠标离开了';
_color = Colors.blue;
});
},
onHover: (PointerHoverEvent e) {
setState(() {
_color = Colors.lightBlueAccent;
});
},
),
我们注意到,在每个回调方法里分别都有一个基于PointerEvent的PointerEnterEvent、PointerExitEvent或PointerHoverEvent对象的值,我们来看看这个对象都有哪些信息。
PointerEvent
Duration timeStamp
:事件调度的时间。和PointerExitEvent的该属性配合,可以计算出鼠标指针停留的时间int pointer
:指针的唯一标识符,不重复使用。每个新的指针向下事件的更改PointerDeviceKind kind
:获取当前使用的是哪种指针设备。该对象属性有以下几种值:PointerDeviceKind.stylus
:手写笔PointerDeviceKind.invertedStylus
:倒置触控笔PointerDeviceKind.mouse
:鼠标PointerDeviceKind.touch
:触屏PointerDeviceKind.unknown
:未知
int device
:指点设备的唯一标识符,在交互中重复使用Offset position
:鼠标指针进入时停留的位置Offset delta
:自上次PointerMoveEvent或PointerHoverEvent以来指针移动的逻辑像素距离int buttons
:使用 Button 常量的位字段,例如 [kPrimaryMouseButton]、[kSecondaryStylusButton] 等。例如,如果 this 的值为 6 并且 [kind] 是 [PointerDeviceKind.invertedStylus],则这表示倒置的触控笔及其按下主要和次要按钮bool obscured
:如果来自不同安全域的应用程序以任何方式遮挡此应用程序的窗口,则设置double pressure
:触摸的压力。该值是一个数字,范围从 0.0(表示没有可辨别压力的触摸)到 1.0(表示具有“正常”压力的触摸,并且可能超过,表示更强的触摸)。对于不检测压力的设备(例如鼠标),返回 1.0double pressureMin
:pressure返回的最小值double pressureMax
:pressure返回的最大值double distance
:检测到的物体与输入表面的距离。例如,该值可以是触控笔或手指与触摸屏的距离,以任意(不一定是线性)刻度上的任意单位表示。如果指针向下,则定义为 0.0double distanceMax
:物体与输入表面的最大值double size
:被按下的屏幕区域。该值被缩放到 0 到 1 之间的范围。它可用于确定胖触摸事件。此值仅在 Android 上设置,是可检测值范围内特定于设备的近似值。因此,例如,0.1 的值可能意味着用指尖触摸,0.2 表示用全指触摸,0.3 表示全掌触摸。因为这个值使用设备特定的范围并且未校准,所以它的用途有限,主要是为了能够为 [AndroidView] 重建原始指针事件而保留double rad5iusMajor
:沿主轴的接触椭圆的半径,以逻辑像素为单位double radiusMinor
:沿短轴的接触椭圆的半径,以逻辑像素为单位double radiusMin
:此指针的 [radiusMajor] 和 [radiusMinor] 可以报告的最小值,以逻辑像素为单位double radiusMax
:此指针的 [radiusMajor] 和 [radiusMinor] 可以报告的最大值,以逻辑像素为单位double orientation
:被检测物体的方位角,以弧度为单位。对于 [PointerDeviceKind.touch] 事件:接触椭圆的角度,以弧度为单位,范围为:-pi2 < 方向 <= pi2 ...给出椭圆长轴与 y 轴的角度(负角表示沿左上角右下角对角线的方向,正角表示沿右上角左下角对角线的方向,零表示与 y 轴平行的方向)。对于 [PointerDeviceKind.stylus] 和 [PointerDeviceKind.invertedStylus] 事件:触控笔的角度,以弧度为单位,范围为:-pi <orientation <= pi ...给出投影到输入表面上的触控笔轴的角度,相对于该表面的正 y 轴(因此 0.0 表示如果投射到该表面上,触控笔将从接触点垂直向上沿 y 轴正方向移动,pi 表示触控笔将向下y 轴负方向;pi4 表示触控笔向上和向右移动,-pi2 表示触控笔向左移动,等等)double tilt
:检测到的物体的倾斜角度,以弧度为单位。对于 [PointerDeviceKind.stylus] 和 [PointerDeviceKind.invertedStylus] 事件:触控笔的角度,以弧度为单位,范围为:0 <= 倾斜 <= pi2 ...给出触控笔轴相对于轴的角度垂直于输入表面(因此 0.0 表示手写笔垂直于输入表面的平面,而 pi2 表示手写笔在该表面上是平的)int platformData
:与事件关联的不透明平台特定数据Matrix4? transform
:用于将此事件从全局坐标空间变换到事件接收器的坐标空间的变换。此值影响 [localPosition] 和 [localDelta] 返回的内容。如果此值为 null,则将其视为身份转换。与绘画变换不同,这种变换通常不包含任何“透视”分量,这意味着矩阵的第三行和第三列应该等于“0,0,1,0”。这确保了 [localPosition] 描述了用户实际触摸屏幕的事件接收器的本地坐标系中的点。另见:[transformed],它将这个事件转换到不同的坐标空间PointerEvent? original
:在应用任何 [transform] 之前的原始未转换 [PointerEvent]。如果 [transform] 为 null 或身份转换,则这可能为 null。当不同坐标空间中的多个事件接收器接收到一个事件时,它们都接收到变换到其本地坐标空间的事件。 [original] 属性可用于确定所有这些转换后的事件是否实际上源自相同的指针交互bool down
:设置指针当前是否向下。
对于触摸和触控笔指针,这意味着对象(手指、笔)与输入表面接触。对于鼠标来说,这意味着按下了一个按钮bool synthesized
:设置事件是否由 Flutter 合成。我们偶尔会从引擎合成不是 [PointerData] 的精确翻译的 PointerEvents,以涵盖指针行为中跨操作系统的小差异。例如,在结束事件上,Android 在发出结束事件时总是丢弃在其报告间隔之间发生的任何位置变化。在 iOS 上,可以在结束事件上报告先前移动事件的轻微错误位置更改。我们合成一个 [PointerEvent] 来覆盖这种情况下两个事件之间的差异int embedderId
:将PointerEvent与创建它的嵌入事件联系起来的唯一标识符。在设置它的平台上,没有两个指针事件可以具有相同的embedderId 。这与pointer标识符不同 - 用于命中测试,而embedderId用于识别平台事件
MouseCursor
自定义鼠标样式。要想自定义鼠标样式,我们可以使用SystemMouseCursors类来给MouseCursor属性赋值。
MouseRegion(
cursor: SystemMouseCursors.wait,
),
SystemMouseCursors还有其他效果,可以自己试一下