• 第一百四十六回 跟手指移动的小球



    我们在上一章回中介绍了如何给组件添加阴影相关的内容,本章回中将介绍如何实现一个 跟手指移动的小球.闲话休提,让我们一起Talk Flutter吧。

    概念介绍

    我们在本章回中介绍的内容是一个小圆球,当手指在手机屏幕上点击或者移动时,它会跟着手指移动,手指移动到哪里小圆球就跟到哪里,真正做到形影不离。

    实现这个移动的的小圆球需要使用手势识别组件:GestureDetector.我们在前面章回中介绍过该组件的使用方法,如果有看官忘记了可以点击这里查看。本章回中将介绍如何使用GestureDetector组件实现跟手指移动的小圆球。

    实现方法

    1. 使用Container组件创建一个圆球组件;
    2. 在圆球组件外层嵌套一个Stack组件,圆球的位置通过Posiontioned组件控制;
    3. 在Stack组件外层嵌套GestureDetector组件,通过组件来捕获手指滑动事件;
    4. 给GestureDetector组件的onPanUpdate属性和onPanEnd属性赋值;

    我们重点说一下第4步中的两个属性,这两个属性都是方法类型,当手指在手机屏幕上移动时会回调onPanUpdate属性对应的方法,当手指停止移动时会回调onPanEnd属性对应的方法。我们可以在这两个方法中修改小圆球的坐标,让它的坐标和手指滑动位置的坐标相同,这样就可以让小圆球跟着手指移动。

    示例代码

    ///创建小圆球组件
    class Ball extends StatelessWidget {
      const Ball({super.key});
    
      
      Widget build(BuildContext context) {
        return Container(
          width: 60,
          height: 60,
          decoration: const BoxDecoration(
            shape: BoxShape.circle,
            color: Colors.green,
          ),
        );
      }
    }
    
    
    GestureDetector(
      child: Container(
        color: Colors.yellow,
        width: bigX,
        height: bigY,
        child: Stack(
          children: [
            Positioned(
              left: smallX,
              top: smallY,
              child:const Ball(),),
          ],
        ),
      ),
      ///响应拖动事件,注意事件中的坐标值是偏移值
      ///global是相对于屏幕的坐标,local是相对于父组件,delta是相对和偏移值
      onPanUpdate: (DragUpdateDetails details) {
        setState(() {
          ///使用偏移值的方法修改小圆坐标,不需要考虑ball的大小,因为得到的是偏移量
          smallX += details.delta.dx;
          smallY += details.delta.dy;
          ///使用当前坐标值的方法修改小圆坐标,需要考虑ball的大小,否则不够精确
          // smallX = details.localPosition.dx - smallR;
          // smallY = details.localPosition.dy - smallR;
        });
      },
      ///响应停止拖动事件,停止拖动后ball回到原位
      onPanEnd: (DragEndDetails details) {
        setState(() {
          smallX = smallY = 100;
        });
      },
    ),
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    我们在上面的代码中添加了注释,这样方便大家理解代码。此外,在修改小圆球的坐标时,使用了两种方法去实现。

    此外,还有一个细节需要说明:我们使用Positioned组件的left和top属性来小圆球的坐标,它们表示小圆球的左上角坐标为(left,top),注意是左上角,而不是圆心,此时小圆球的圆心与原点坐标(屏幕左上角)的直线距离可以通过以下方法计算出来:取(left*left + top*top)值的平方根再加上小圆球的半径。这个计算方法的核心思路是数学中的勾股定理。

    看官们,与"跟手指移动的小球"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

  • 相关阅读:
    c语言练习45:模拟实现内存函数memcpy
    java中线程池的使用+优雅的spring释放资源
    TC358743XBG/TC358749XBG(\w Scaler):HDMI转MIPI CSI东芝转换芯片
    软件测试基础-自动化测试技术
    学校介绍静态HTML网页设计作品 DIV布局学校官网模板代码 DW大学网站制作成品下载 HTML5期末大作业
    【中秋福利】大数据告诉你:今年中秋礼品这样选
    【杂记-浅谈交换机的二层转发和三层转发】
    【环境配置】使用Docker搭建LAMP环境
    基于Java+SpringBoot+Vue校园求职招聘系统的设计与实现 前后端分离【Java毕业设计·文档报告·代码讲解·安装调试】
    spring 注解练习
  • 原文地址:https://blog.csdn.net/talk_8/article/details/132952135