广告位联系
返回顶部
分享到

使用Flutter实现手写签名效果的教程

Android 来源:互联网 作者:佚名 发布时间:2022-12-25 16:39:35 人浏览
摘要

思路 需要监听用户触摸的起始点和结束点,并记录途经点,这里我使用了StreamController 将途经点从起始位置到结束位置绘制出来,这里用到CustomPainter 绘制流程 获取触摸点作为画笔的起

思路

  • 需要监听用户触摸的起始点和结束点,并记录途经点,这里我使用了StreamController
  • 将途经点从起始位置到结束位置绘制出来,这里用到CustomPainter

绘制流程

  • 获取触摸点作为画笔的起始点
  • 手机途经点
  • 绘制途径路线
  • 结束触摸点重置画笔

具体实现

需要一个Listener用来监听用户行为,并将这些行为的点添加到StreamController中, 两个变量

final List _points = []; //承载对应的点
final StreamController _controller = StreamController(); //数据通信

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

Widget _buildWriteWidget() {

  return Stack(

    children: [

      Listener( //用来监听用户的触摸行为

        child: Container(

          color: Colors.transparent,

        ),

        onPointerDown: (PointerDownEvent event) {

          _points.add(event.localPosition);

          _controller.sink.add([_points]);  //起始点的记录

        },

        onPointerMove: (PointerMoveEvent event) {

          _points.add(event.localPosition);

          _controller.sink.add([_points]);  //添加途经点

        },

        onPointerUp: (PointerUpEvent event) {

          _points.add(Offset.zero); //结束的标记

        },

      ),

      StreamBuilder(

          stream: _controller.stream,

          builder: (BuildContext context, AsyncSnapshot snapshot) {

            return snapshot.hasData

                ? CustomPaint(painter: LinePainter(snapshot.data))  //关联数据到Painter

                : const SizedBox();

          }),

      Positioned(

          bottom: 50,

          right: 50,

          child: FloatingActionButton(

            onPressed: () {

              _clear();

            },

            child: const Icon(Icons.cleaning_services),

          ))

    ],

  );

}

清除StreamController的内容,重置数据

1

2

3

4

void _clear() {

  _points.clear();

  _controller.add(null);

}

dispose时释放StreamController

1

2

3

4

5

@override

void dispose() {

  _controller.close();

  super.dispose();

}

画笔Painter

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

class LinePainter extends CustomPainter {

  final List<List<Offset>> lines;

  final Color paintColor = Colors.black;

  final Paint _paint = Paint();

 

  LinePainter(this.lines);

 

  @override

  void paint(Canvas canvas, Size size) {

    _paint.strokeCap = StrokeCap.round;

    _paint.strokeWidth = 5.0;

    if (lines.isEmpty) {

      canvas.drawPoints(PointMode.polygon, [Offset.zero, Offset.zero], _paint);

    } else {

      for (int i = 0; i < lines.length; i++) {

        for (int j = 0; j < lines[i].length - 1; j++) {

          if (lines[i][j] != Offset.zero && lines[i][j + 1] != Offset.zero) {

            canvas.drawLine(lines[i][j], lines[i][j + 1], _paint);  //绘制相应的点

          }

        }

      }

    }

  }

 

  @override

  bool shouldRepaint(covariant CustomPainter oldDelegate) => true;

}


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://juejin.cn/post/7180186082489663547
相关文章
  • Android音视频开发Media FrameWork框架源码解析
    一、Media FrameWork背景 Media Framework (媒体函数库):此函数库让Android 可以播放与录制许多常见的音频与视频文件,支持的文件类型包括MPEG4、
  • 使用Flutter实现手写签名效果的教程
    思路 需要监听用户触摸的起始点和结束点,并记录途经点,这里我使用了StreamController 将途经点从起始位置到结束位置绘制出来,这里用到
  • Kotlin协程与挂起函数及suspend关键字深入理解

    Kotlin协程与挂起函数及suspend关键字深入理解
    1.挂起函数 挂起函数在Kotlin协程中是一个比较重要的知识点,协程的非阻塞式、Channel、Flow等API都对它有充分的理解才能在学习时事半功倍。
  • Android自定义View实现绘制水波浪温度刻度表

    Android自定义View实现绘制水波浪温度刻度表
    之前的绘制圆环,我们了解了如何绘制想要的形状和进度的一些特点,那么此篇文章我们更近一步,绘制一个稍微复杂一点的刻度与波浪。
  • Android硬件解码组件MediaCodec使用教程
    1.MediaCodec 是什么 MediaCodec类可以访问底层媒体编解码器框架(StageFright 或 OpenMAX),即编解码组件。是Android 的低层多媒体基础设施的一部分
  • Flow解决背压问题的方法介绍

    Flow解决背压问题的方法介绍
    随着时间的推移,越来越多的主流应用已经开始全面拥抱Kotlin,协程的引入,Flow的诞生,给予了开发很多便捷,作为协程与响应式编程结合
  • Andorid开发中反射机制的介绍
    在andorid开发中,经常遇见在某些工具类中没有Context上下文对象时,一些系统服务的代理对象无法创建出来,举个例子:比如在源码(framewo
  • Flutter加载图片的多样玩法汇总

    Flutter加载图片的多样玩法汇总
    加载本地图片 在项目目录下创建assets文件夹,再在其文件夹下创建images文件夹,后面将需要的图片复制到其中即可 在pubspec.yaml文件中添加引
  • Kotlin的Collection与Sequence操作异同点介绍

    Kotlin的Collection与Sequence操作异同点介绍
    在Android开发中,集合是我们必备的容器,Kotlin的标准库中提供了很多处理集合的方法,而且还提供了两种基于容器的工作方式:Collection 和
  • 实现一个Kotlin函数类型方法

    实现一个Kotlin函数类型方法
    接口与函数类型 业务开发中,经常会有实现一个函数式接口(即接口只有一个方法需要实现)的场景,大家应该都会不假思索的写出如下代
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计