網(wǎng)站首頁 編程語言 正文
思路
- 需要監(jiān)聽用戶觸摸的起始點和結束點,并記錄途經(jīng)點,這里我使用了
StreamController
- 將途經(jīng)點從起始位置到結束位置繪制出來,這里用到
CustomPainter
繪制流程
- 獲取觸摸點作為畫筆的起始點
- 手機途經(jīng)點
- 繪制途徑路線
- 結束觸摸點重置畫筆
具體實現(xiàn)
需要一個Listener用來監(jiān)聽用戶行為,并將這些行為的點添加到StreamController
中, 兩個變量
final List _points = []; //承載對應的點
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); //結束的標記 }, ), StreamBuilder( stream: _controller.stream, builder: (BuildContext context, AsyncSnapshot snapshot) { return snapshot.hasData ? CustomPaint(painter: LinePainter(snapshot.data)) //關聯(lián)數(shù)據(jù)到Painter : const SizedBox(); }), Positioned( bottom: 50, right: 50, child: FloatingActionButton( onPressed: () { _clear(); }, child: const Icon(Icons.cleaning_services), )) ], ); }
清除StreamController
的內容,重置數(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); //繪制相應的點 } } } } } @override bool shouldRepaint(covariant CustomPainter oldDelegate) => true; }
總結
原文鏈接:https://juejin.cn/post/7180186082489663547
相關推薦
- 2022-07-20 C/C++詳解實現(xiàn)二層轉發(fā)_C 語言
- 2024-01-16 URLClassLoader詳解
- 2022-04-19 python獲取http請求響應頭headers中的數(shù)據(jù)的示例_python
- 2023-07-25 node項目使用crypto模塊為用戶密碼加密
- 2023-02-09 使用adb?or?fastboot命令進入高通的9008(edl)模式的兩種方法_Android
- 2022-02-25 C++構造函數(shù)的初始化列表詳解_C 語言
- 2023-01-08 C#實現(xiàn)屏幕抓圖并保存的示例代碼_C#教程
- 2022-09-05 C語言中scanf函數(shù)的原樣輸入的坑及解決_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支