如何使用Flutter實現(xiàn)手寫簽名效果
思路
- 需要監(jiān)聽用戶觸摸的起始點和結(jié)束點,并記錄途經(jīng)點,這里我使用了
StreamController
- 將途經(jīng)點從起始位置到結(jié)束位置繪制出來,這里用到
CustomPainter
繪制流程
- 獲取觸摸點作為畫筆的起始點
- 手機途經(jīng)點
- 繪制途徑路線
- 結(jié)束觸摸點重置畫筆
具體實現(xiàn)
需要一個Listener用來監(jiān)聽用戶行為,并將這些行為的點添加到StreamController
中, 兩個變量
final List _points = []; //承載對應(yīng)的點
final StreamController _controller = StreamController(); //數(shù)據(jù)通信
Widget _buildWriteWidget() { return Stack( children: [ Listener( //用來監(jiān)聽用戶的觸摸行為 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]); //添加途經(jīng)點 }, onPointerUp: (PointerUpEvent event) { _points.add(Offset.zero); //結(jié)束的標(biāo)記 }, ), StreamBuilder( stream: _controller.stream, builder: (BuildContext context, AsyncSnapshot snapshot) { return snapshot.hasData ? CustomPaint(painter: LinePainter(snapshot.data)) //關(guān)聯(lián)數(shù)據(jù)到Painter : const SizedBox(); }), Positioned( bottom: 50, right: 50, child: FloatingActionButton( onPressed: () { _clear(); }, child: const Icon(Icons.cleaning_services), )) ], ); }
清除StreamController
的內(nèi)容,重置數(shù)據(jù)
void _clear() { _points.clear(); _controller.add(null); }
dispose時釋放StreamController
@override void dispose() { _controller.close(); super.dispose(); }
畫筆Painter
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); //繪制相應(yīng)的點 } } } } } @override bool shouldRepaint(covariant CustomPainter oldDelegate) => true; }
總結(jié)
到此這篇關(guān)于如何使用Flutter實現(xiàn)手寫簽名效果的文章就介紹到這了,更多相關(guān)Flutter手寫簽名效果內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android中父View和子view的點擊事件處理問題探討
當(dāng)屏幕中包含一個ViewGroup,而這個ViewGroup又包含一個子view,這個時候android系統(tǒng)如何處理Touch事件呢,接下來將對此問題進行深入了解,感興趣的朋友可以了解參考下,或許對你有所幫助2013-01-01Flutter 使用Navigator進行局部跳轉(zhuǎn)頁面的方法
這篇文章主要介紹了Flutter 使用Navigator進行局部跳轉(zhuǎn)頁面的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05Android使用CoordinatorLayout實現(xiàn)底部彈出菜單
這篇文章主要為大家詳細介紹了Android使用CoordinatorLayout實現(xiàn)底部彈出菜單,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-11-11Android利用Document實現(xiàn)xml讀取和寫入操作
這篇文章主要為大家詳細介紹了Android利用Document實現(xiàn)xml讀取和寫入操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12自定義視圖view使用Canvas實現(xiàn)手寫板和涂鴉功能
這篇文章主要介紹了自定義視圖view使用Canvas實現(xiàn)手寫板和涂鴉功能,這里直接上代碼,里面有詳細講解和注釋,需要的朋友可以參考下2023-04-04