首页 > 其他分享 >Flutter手势组件(2):PointerEvent

Flutter手势组件(2):PointerEvent

时间:2024-11-20 13:41:24浏览次数:1  
标签:PointerEvent 0.0 HitTestBehavior 点击 事件 组件 Flutter

一、PointerEvent介绍

PointerEvent是触摸、手写笔、鼠标事件的基类。

在上文中,我们知道了什么是Listener并写了一个简单的案例,在使用案例的过程中我们的事件里面都带了一个event参数,而所有的事件最终都是继承自PointerEvent,那我们接下来看看event的参数有什么作用。

二、PointerEvent构造函数

const PointerEvent({
  this.embedderId = 0,
  this.timeStamp = Duration.zero,
  this.pointer = 0,
  this.kind = PointerDeviceKind.touch,
  this.device = 0,
  this.position = Offset.zero,
  Offset? localPosition,
  this.delta = Offset.zero,
  Offset? localDelta,
  this.buttons = 0,
  this.down = false,
  this.obscured = false,
  this.pressure = 1.0,
  this.pressureMin = 1.0,
  this.pressureMax = 1.0,
  this.distance = 0.0,
  this.distanceMax = 0.0,
  this.size = 0.0,
  this.radiusMajor = 0.0,
  this.radiusMinor = 0.0,
  this.radiusMin = 0.0,
  this.radiusMax = 0.0,
  this.orientation = 0.0,
  this.tilt = 0.0,
  this.platformData = 0,
  this.synthesized = false,
  this.transform,
  this.original,
}) : localPosition = localPosition ?? position,
     localDelta = localDelta ?? delta;

三、PointerEvent属性和说明

PointerEvent的属性非常多,但在我们实际的开发过程中很少会使用到,只有在特定的情景下才会使用对应的属性。

  • 如需要做一个全局悬浮的按钮我们会使用到position

  • 如需要做绘图软件我们需要用到buttonskind

所以大家可以根据实际的应用场景来使用对应的属性即可,下面是我对PointerEvent的属性进行的一个详细描述:

字段 属性 描述
embedderId int 标识平台事件ID
timeStamp Duration 事件调度时间
pointer int 指针唯一标识符,每一次点击都会是一个新的,不会重复
kind PointerDeviceKind 指针事件的输入设备类型
device int 设备唯一标识符,在交互中会重复使用
position Offset 指针相对于全局坐标的偏移
localPosition Offset 指针相对于当前容器坐标的偏移
delta Offset 两次指针移动事件的距离
localDelta Offset 两次指针移动事件的距离(当前容器)
down bool 设置当前指针是否按下
obscured bool 是否遮挡应用程序的窗口,该属性官方还没实现
distance double 检测物体与输入表面的距离
size double 被按下屏幕的区域大小
radiusMajor double 接触椭圆沿主轴的半径,以逻辑像素为单位
radiusMinor double 接触椭圆沿短轴的半径,以逻辑像素为单位
orientation double 检测到的物体的方向(指针移动方向),以弧度为单位
tilt double 检测到的物体的倾斜角度,以弧度为单位
synthesized bool 设置事件是否由 Flutter 合成。
transform Matrix4 用于从全局坐标转换此事件的转换
original PointerEvent 在任何transform之前的原始未转换PointerEvent事件

四、behavior属性

behavior属性,它决定子组件如何响应命中测试,它的值类型为HitTestBehavior,这是一个枚举类,有三个枚举值

  • HitTestBehavior.deferToChild:对子组件一个接一个的进行命中测试,如果子组件中有测试通过的,则当前组件通过,这就意味着,如果指针事件作用于子组件上时,其父级组件也肯定可以收到该事件

  • HitTestBehavior.opaque:在命中测试时,将当前组件当成不透明处理(即使本身是透明的),最终的效果相当于当前Widget的整个区域都是点击区域

  • HitTestBehavior.translucent:点击组件透明区域时,可以对自身边界内及底部可视区域都进行命中测试,这意味着点击顶部组件透明区域时,顶部组件和底部组件都可以接收到事件

五、代码演示

// ignore_for_file: prefer_const_constructors
import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ListenerSimpleExample(),
    );
  }
}

class ListenerSimpleExample extends StatefulWidget {
  const ListenerSimpleExample({super.key});  
  @override
  State<ListenerSimpleExample> createState() => _ListenerSimpleExampleState();
}

class _ListenerSimpleExampleState extends State<ListenerSimpleExample> with AutomaticKeepAliveClientMixin {

  @override
  bool get wantKeepAlive => true;

  @override
  Widget build(BuildContext context) {
    super.build(context);
    return Scaffold(
      appBar: AppBar(
        title: Text("Listener"),
      ),
      body: Center(
        child: Stack(
          children: [
            Listener(
              child: ConstrainedBox(
                  constraints: BoxConstraints.tight(Size(400, 200)),
                  child: Container(
                    color: Colors.greenAccent,
                  )
              ),
              onPointerDown: (event) => debugPrint("绿色盒子被点击了"),
            ),
            Listener(
              onPointerDown: (event) => debugPrint("文字点击事件回调"),
              behavior: HitTestBehavior.deferToChild,
              // behavior: HitTestBehavior.opaque,
              // behavior: HitTestBehavior.translucent,              
              child: ConstrainedBox(
                constraints: BoxConstraints.tight(Size(400, 200)),
                child: Center(child: Text("点击文字", style: TextStyle(
                  color: Colors.white,
                  fontSize: 30
                ),)),
              ),
            )
          ],
        ),
      ),
    );
  }
}

效果图如下所示:

Flutter_event_B.png


我们这里演示每次都是先点击绿色盒子在点击文字,以便大家能更好的分辨出这三个属性的使用区别。

当属性设置为HitTestBehavior.deferToChild控制台输出结果:

flutter: 绿色盒子被点击了
flutter: 文字点击事件回调

当属性设置为HitTestBehavior.opaque控制台输出结果:

flutter: 文字点击事件回调
flutter: 文字点击事件回调

当属性设置为HitTestBehavior.translucent控制台输出结果:

flutter: 文字点击事件回调
flutter: 绿色盒子被点击了
flutter: 文字点击事件回调

标签:PointerEvent,0.0,HitTestBehavior,点击,事件,组件,Flutter
From: https://www.cnblogs.com/linuxAndMcu/p/18556708

相关文章

  • Flutter手势组件(4):MouseRegion
    一、MouseRegion介绍在我们进行h5开发的时候,我们都知道css有一个hover来改变元素的样式,那么我们在Flutter中也可以通过MouseRegion是监听区域内鼠标的进入和退出以及移动轨迹。二、什么情况下使用MouseRegion?MouseRegion常用于Flutter的Web开发或者桌面程序中,当我们鼠标需要......
  • Flutter手势组件(3):GestureDetector
    一、GestureDetector介绍在前面的文章中我们介绍了Listener,而GestureDetector是对Listener的封装,提供非常多的手势,包括单击、双击、拖动、混合手势等。二、什么情况下使用GestureDetector?当我们需要对文字需要增加点击事件时,或者需要对组件进行拖动、缩放等那我们就可以借助Ge......
  • uniapp项目清理工具:自动查找未使用的组件和资源文件
    uniapp项目清理工具:自动查找未使用的组件和资源文件前言在开发uniapp项目的过程中,随着项目规模的增长,经常会遇到一些组件和资源文件(图片、音频等)不再使用但仍然保留在项目中的情况。这些无用文件不仅占用存储空间,还会影响项目的维护性。为了解决这个问题,我开发了两个No......
  • Vue前端开发子组件向父组件传参
    在父组件中,如果需要获取子组件中的数据,有两种方式,一种是在子组件中自定义事件,父组件绑定该事件,当触发自定义事件时,向父组件传入参数;另一种是先通过ref属性给子组件命名,然后在父组件中就可以调用$refs对象,访问命名的子组件中数据。子组件自定义事件传参父组件通过绑定子组......
  • Flutter 扫描二维码
    在今天的移动开发中,二维码扫描已经成为了常见的功能之一。Flutter作为一款跨平台的开发框架,提供了丰富的插件和功能,使得开发者可以轻松实现二维码扫描以及图像识别功能。本文将介绍如何在Flutter中通过结合 scan 插件、permission_handler 插件以及 image_picker 插件,实现......
  • Unity新导航系统---NavMeshObstacle组件
    系列文章目录Unity新导航系统—NavMeshObstacle组件文章目录系列文章目录前言NavMeshObstacle组件前言NavMeshObstacle组件:用于在场景中定义动态障碍物,来影响导航主体(NavMeshAgent)的路径选择。这是我的学习笔记,记载的是NavMeshObstacle组件的用法和各......
  • Vue.js组件开发指南
    Vue.js组件开发涵盖多方面内容。从基础层面看,组件作为可复用的Vue实例,能通过多种方式注册,其props用于接收外部数据、data需为函数以保障数据独立。生命周期的各个钩子函数在组件不同阶段发挥作用。组件通信包括父子间的特定方式和非父子间利用事件总线。样式方面有作用域样......
  • React 组件中 State 的定义、使用及正确更新方式
    ​......
  • 尤雨溪都在推荐的Naive UI,Vue组件库的新选择,好用到爆!
    大家好,欢迎来到程序视点!我是小二哥!今天给大家推荐一个完全使用TypeScript编写的Vue3组件库:NaiveUI  Vue作者尤雨溪官方推荐。不可小觑!  关于NaiveUINaiveUI是一款基于当前比较新的Vue3.0/TypeScript技术栈开发的前端......
  • Oracle 深入学习 Part 1: Oracle Architectural Components(Oracle 架构组件)
    Oracle服务器(OracleServer)OracleServer是一个管理系统,提供一种开放、全面、集成的信息管理方式。它包含了Oracle实例(OracleInstance)和Oracle数据库(OracleDatabase)。1.Oracle实例(OracleInstance)定义:Oracle实例是访问Oracle数据库的方式,始终打开一个且仅......