現(xiàn)手寫簽名效果)
如何使用Flutter實(shí)現(xiàn)手寫簽名的效果思路需要監(jiān)聽用戶觸摸的起始點(diǎn)和結(jié)束點(diǎn)并記錄途經(jīng)點(diǎn)這里我使用了StreamController將途經(jīng)點(diǎn)從起始位置到結(jié)束位置繪制出來這里用到CustomPainter繪制流程獲取觸摸點(diǎn)作為畫筆的起始點(diǎn)手機(jī)途經(jīng)點(diǎn)繪制途徑路線結(jié)束觸摸點(diǎn)重置畫筆具體實(shí)現(xiàn)需要一個(gè)Listener用來監(jiān)聽用戶行為并將這些行為的點(diǎn)添加到StreamController中 兩個(gè)變量final List _points []; //承載對應(yīng)的點(diǎn)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]); //起始點(diǎn)的記錄 }, onPointerMove: (PointerMoveEvent event) { _points.add(event.localPosition); _controller.sink.add([_points]); //添加途經(jīng)點(diǎn) }, 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時(shí)釋放StreamControlleroverride void dispose() { _controller.close(); super.dispose(); }畫筆Painterclass LinePainter extends CustomPainter { final ListListOffset 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)的點(diǎn) } } } } } override bool shouldRepaint(covariant CustomPainter oldDelegate) true; }作者Jerry815鏈接https://juejin.cn/post/7180186082489663547最后如果想要成為架構(gòu)師或想突破20~30K薪資范疇那就不要局限在編碼業(yè)務(wù)要會選型、擴(kuò)展提升編程思維。此外良好的職業(yè)規(guī)劃也很重要學(xué)習(xí)的習(xí)慣很重要但是最重要的還是要能持之以恒任何不能堅(jiān)持落實(shí)的計(jì)劃都是空談。如果你沒有方向這里給大家分享一套由阿里高級架構(gòu)師編寫的《Android八大模塊進(jìn)階筆記》幫大家將雜亂、零散、碎片化的知識進(jìn)行體系化的整理讓大家系統(tǒng)而高效地掌握Android開發(fā)的各個(gè)知識點(diǎn)。相對于我們平時(shí)看的碎片化內(nèi)容這份筆記的知識點(diǎn)更系統(tǒng)化更容易理解和記憶是嚴(yán)格按照知識體系編排的。全套視頻資料一、面試合集二、源碼解析合集三、開源框架合集歡迎大家一鍵三連支持若需要文中資料直接點(diǎn)擊文末CSDN官方認(rèn)證微信卡片免費(fèi)領(lǐng)取↓↓↓