Flutter 实现软鼠标

文章目录


前言

flutter在嵌入式系统中运行时,有可能遇到drm鼠标无法使用的情况,但鼠标事件却可以正常接收,此时如果有软鼠标,就可以一定程度解决问题。本文提供了一个软鼠标的简单实现,主要适用于无法使用硬鼠标的场景


一、如何实现?

1、记录鼠标偏移

dart 复制代码
final _offset = ValueNotifier<Offset>(Offset.zero);

2、MouseRegion获取偏移

dart 复制代码
MouseRegion(
        onHover: (event) {
          _offset.value = event.position;
        },)

3、Transform移动图标

dart 复制代码
ValueListenableBuilder(
              valueListenable: _offset,
              builder: (context, value, child) => Transform.translate(
                offset: value,)
                )

二、完整代码

dart 复制代码
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});
  @override
  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),
                ),
              ),
            ),
          ],
        ));
  }
}

三、使用示例

dart 复制代码
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: SoftMouse(
            child: const SizedBox(),
          ),
        ),
      ),
    );
  }
}

效果预览


总结

以上就是今天要讲的内容,本文实现的软鼠标还是比较简单的,当然软鼠标对性能还是有一定的影响的,比如在linux中,每次移动都会触发交换缓存进行drm显示。

相关推荐
ujainu1 小时前
Flutter + OpenHarmony 实现经典打砖块游戏开发实战—— 物理反弹、碰撞检测与关卡系统
flutter·游戏·openharmony·arkanoid·breakout
微祎_1 小时前
构建一个 Flutter 点击速度测试器:深入解析实时交互、性能度量与响应式 UI 设计
flutter·ui·交互
王码码20351 小时前
Flutter for OpenHarmony 实战之基础组件:第二十七篇 BottomSheet — 动态底部弹窗与底部栏菜单
android·flutter·harmonyos
ZH15455891312 小时前
Flutter for OpenHarmony Python学习助手实战:Web开发框架应用的实现
python·学习·flutter
晚霞的不甘2 小时前
Flutter for OpenHarmony 构建简洁高效的待办事项应用 实战解析
flutter·ui·前端框架·交互·鸿蒙
百锦再2 小时前
Vue高阶知识:利用 defineModel 特性开发搜索组件组合
前端·vue.js·学习·flutter·typescript·前端框架
廖松洋(Alina)3 小时前
【收尾以及复盘】flutter开发鸿蒙APP之成就徽章页面
flutter·华为·开源·harmonyos·鸿蒙
ZH15455891313 小时前
Flutter for OpenHarmony Python学习助手实战:机器学习算法实现的实现
python·学习·flutter
廖松洋(Alina)3 小时前
【收尾以及复盘】flutter开发鸿蒙APP之打卡日历页面
flutter·华为·开源·harmonyos·鸿蒙
廖松洋(Alina)3 小时前
【收尾以及复盘】flutter开发鸿蒙APP之本月数据统计页面
flutter·华为·开源·harmonyos·鸿蒙