美文网首页Flutter
Flutter-指针事件知识

Flutter-指针事件知识

作者: 阿博聊编程 | 来源:发表于2022-06-20 11:36 被阅读0次
配图来自网络,如侵必删
Flutter开发当中,我们可能会遇到下面的需求:

定位用户手指当前处于的位置,以及点击了多少次。

遇到这种需求,我们就需要使用指针事件来帮我们实现。这篇博客分享指针事件的知识,希望对看文章的小伙伴有所帮助。

指针事件

怎么获取指针事件?这是一个很关键的问题,大概的实现思路是:

  • Flutter应用中每个显示在屏幕中的页面都会被Listener组件包裹,我们首先要获取Listener组件;
  • 我们通过Listener组件获取用户和屏幕交互的原始数据。

指针事件对象中存放了这个指针的位置、偏移量等用户与设备屏幕交互的原始数据信息。

Listener组件源码

  const Listener({
    Key? key,
    this.onPointerDown, // 手指按下回调
    this.onPointerMove, // 手指移动回调
    this.onPointerUp, // 手指抬起回调
    this.onPointerHover, // 悬停
    this.onPointerCancel, // 触摸事件取消回调
    this.onPointerSignal, // 
    this.behavior = HitTestBehavior.deferToChild,
    Widget? child,
  })

Listener组件API

事件API 事件描述
onPointerDown 用户按下时回调的参数
onPointerMove 用户在屏幕上移动时的回调
PointerEvent 用户抬起手指回调的对象

简单的代码示例

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Listener Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int downCounter = 0;
  int upCounter = 0;
  double x = 0.0;
  double y = 0.0;

  // 按下事件的处理方法
  void incrementDown(PointerDownEvent event) {
    updateLocation(event);
    setState(() {
      downCounter++;
    });
  }

  // 抬起事件的处理方法
  void incrementUp(PointerUpEvent event) {
    updateLocation(event);
    setState(() {
      upCounter++;
    });
  }

  // 移动事件的处理方法
  void updateLocation(PointerEvent event) {
    setState(() {
      x = event.position.dx;
      y = event.position.dy;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: ConstrainedBox(
          constraints: BoxConstraints.tight(const Size(300, 200)),
          child: Listener(
            onPointerDown: incrementDown,
            onPointerMove: updateLocation,
            onPointerUp: incrementUp,
            child: Container(
              color: Colors.redAccent,
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  const Text('按下抬起的次数:'),
                  Text('按下$downCounter次,抬起$upCounter次'),
                  Text(
                      '目前点击的位置(${x.toStringAsFixed(2)},${y.toStringAsFixed(2)})')
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}

小伙伴们可以直接复制上面的代码运行。效果如下:


效果

相关文章

  • Flutter-指针事件知识

    在 开发当中,我们可能会遇到下面的需求: 定位用户手指当前处于的位置,以及点击了多少次。 遇到这种需求,我们就需要...

  • Flutter-现有iOS工程引入Flutter

    Flutter-现有iOS工程引入Flutter Flutter-现有iOS工程引入Flutter

  • Flutter-为什么包装一层Builder控件之后,路由或点击

    Flutter-为什么包装一层Builder控件之后,路由或点击弹框事件正常使用了?https://juejin....

  • 面向对象闭包

    面向对象备份指针 // this在事件指令中指向事件源 // that称为备份指针 var that = this...

  • 面向对象闭包

    面向对象备份指针 // this在事件指令中指向事件源 // that称为备份指针 var that = this...

  • Flutter-监听滚动事件

    对于滚动的视图,我们经常需要监听它的一些滚动事件,在监听到的时候去做对应的一些事情。比如视图滚动到底部时,我们可能...

  • Flutter小部件之AbsorbPointer

    AbsorbPointer 简述:一个吸收指针事件得小部件。 属性释义absorbing是否吸收指针事件,默认是t...

  • UGUI事件

    事件接口 1.IPointerEnterHandler:指针进入事件 2.IPointerExitHandler:...

  • Listener-手势识别组件

    Listener Listener 是一个监听指针事件的控件,比如按下、移动、释放、取消等指针事件,但Listen...

  • 2020面试问题总结

    一面问题汇总: iOS基本知识:1.OC语言层面,runtime,isa指针,消息机制2.UI,布局,动画,事件传...

网友评论

    本文标题:Flutter-指针事件知识

    本文链接:https://www.haomeiwen.com/subject/cvfjvrtx.html