文章目录
- 前言
- 一、如何实现?
- 1、记录鼠标偏移
- 2、MouseRegion获取偏移
- 3、Transform移动图标
- 二、完整代码
- 三、使用示例
- 总结
前言
flutter在嵌入式系统中运行时,有可能遇到drm鼠标无法使用的情况,但鼠标事件却可以正常接收,此时如果有软鼠标,就可以一定程度解决问题。本文提供了一个软鼠标的简单实现,主要适用于无法使用硬鼠标的场景。
一、如何实现?
1、记录鼠标偏移
final _offset = ValueNotifier<Offset>(Offset.zero);
2、MouseRegion获取偏移
MouseRegion(
onHover: (event) {
_offset.value = event.position;
},)
3、Transform移动图标
ValueListenableBuilder(
valueListenable: _offset,
builder: (context, value, child) => Transform.translate(
offset: value,)
)
二、完整代码
import 'package:flutter/material.dart';
class SoftMouse extends StatelessWidget {
final _offset = ValueNotifier<Offset>(Offset.zero);
final Widget child;
final Widget? cursor;//自定义鼠标样式
SoftMouse({super.key, required this.child, this.cursor});
Widget build(BuildContext context) {
return MouseRegion(
cursor: SystemMouseCursors.none,
onHover: (event) {
_offset.value = event.position;
},
child: Stack(
children: [
child,
ValueListenableBuilder(
valueListenable: _offset,
builder: (context, value, child) => Transform.translate(
offset: value,
child: Align(
alignment: Alignment.topLeft,
child: cursor ?? const Icon(Icons.mouse),
),
),
),
],
));
}
}
三、使用示例
class MyApp extends StatelessWidget {
const MyApp({super.key});
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: SoftMouse(
child: const SizedBox(),
),
),
),
);
}
}
效果预览
总结
以上就是今天要讲的内容,本文实现的软鼠标还是比较简单的,当然软鼠标对性能还是有一定的影响的,比如在linux中,每次移动都会触发交换缓存进行drm显示。