Android
主页 > 软件编程 > Android >

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

2022-12-25 | 佚名 | 点击:

思路

绘制流程

具体实现

需要一个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;

}

原文链接:https://juejin.cn/post/7180186082489663547
相关文章
最新更新