文章目录
- 前言
- 一、如何实现?
- 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 Listener(onPointerMove: (event) {_offset.value = event.position;},child: MouseRegion(cursor: SystemMouseCursors.none,hitTestBehavior: HitTestBehavior.opaque,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: IgnorePointer(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显示。