-10
A
回答
14
您可以使用GestureDetector
创建一个签名区域来记录触摸,并使用CustomPaint
在屏幕上绘制。这里有几个技巧:
- 使用
RenderBox.globalToLocal
由GestureDetector.onPanUpdate
提供的DragUpdateDetails
转换成相对坐标 - 使用
GestureDetector.onPanEnd
手势处理机记录笔画之间的断裂。 - 突变
List
将不会自动触发重绘因为CustomPainter
构造函数参数是相同的。每次提供新点时,都可以通过创建新的List
来触发重绘。 - 使用
Canvas.drawLine
在签名的每个记录点之间绘制一条圆形线。
import 'package:flutter/material.dart';
class SignaturePainter extends CustomPainter {
SignaturePainter(this.points);
final List<Offset> points;
void paint(Canvas canvas, Size size) {
Paint paint = new Paint()
..color = Colors.black
..strokeCap = StrokeCap.round
..strokeWidth = 5.0;
for (int i = 0; i < points.length - 1; i++) {
if (points[i] != null && points[i + 1] != null)
canvas.drawLine(points[i], points[i + 1], paint);
}
}
bool shouldRepaint(SignaturePainter other) => other.points != points;
}
class Signature extends StatefulWidget {
SignatureState createState() => new SignatureState();
}
class SignatureState extends State<Signature> {
List<Offset> _points = <Offset>[];
Widget build(BuildContext context) {
return new GestureDetector(
onPanUpdate: (DragUpdateDetails details) {
setState(() {
RenderBox referenceBox = context.findRenderObject();
Offset localPosition =
referenceBox.globalToLocal(details.globalPosition);
_points = new List.from(_points)..add(localPosition);
});
},
onPanEnd: (DragEndDetails details) => _points.add(null),
child: new CustomPaint(painter: new SignaturePainter(_points)),
);
}
}
class DemoApp extends StatelessWidget {
Widget build(BuildContext context) => new Scaffold(body: new Signature());
}
void main() => runApp(new MaterialApp(home: new DemoApp()));
+0
此代码似乎不再适用于颤动的测试版。我尝试过仿真器和真实设备(Pixel 2),但没有画在屏幕上。 – xrd
相关问题
- 1. 如何从扑翼飞镖应用程序调用手机设置?
- 2. 使用飞镖为移动应用程序
- 3. 为什么我的扑翼应用程序的listview滚动不如扑动画廊应用程序光滑?
- 4. 扑动/飞镖开发验证邮件
- 5. 在飞镖中创建换行符
- 6. 飞镖+聚合物作为网页/应用程序/扩展程序无法在飞镖编辑器外工作
- 7. 飞镖与Maven(在春季启动应用程序)
- 8. 飞镖与原生移动库调用
- 9. 为应用程序动态创建子域名
- 10. 如何从扑翼应用程序发送打印日志?
- 11. 将命令行参数传递给扑翼应用程序
- 12. 使用谷歌飞镖语言的原生移动应用程序
- 13. 在飞镖中动态加载课程
- 14. Chrome扩展程序+飞镖
- 15. 从扑翼应用打电话
- 16. 在飞镖编辑器中自动生成飞镖
- 17. 在flex应用程序中限制鼠标移动区域
- 18. 飞镖Web_Audio飞镖1.6
- 19. 将飞镖板划分为不同的区域?
- 20. 在Rails应用程序中创建管理区域
- 21. 飞镖中的飞镖websocket:io and dart:html
- 22. 如何在我的扑翼应用中添加自定义过渡到我的扑翼路线
- 23. 创建移动应用程序/网站
- 24. 创建移动词典应用程序
- 25. 飞镖程序中的拼写检查
- 26. 如何创建一个飞镖形式
- 27. 从Javascript数组创建飞镖列表
- 28. 创建角度飞镖网络通知
- 29. 飞镖中的简单命令行应用程序I/O
- 30. 计划在Chrome应用程序的飞镖套接字API
我们不鼓励的帖子,简单地陈述问题断章取义,并期望社会来解决它。假设你试图自己解决它并陷入困境,那么如果你写下了你的想法和你无法想象的东西,这可能会有所帮助。添加你的代码的[mcve],并描述你有什么问题。 _“但它不起作用”_不是很有帮助。 – Cerbrus
你的程序[不起作用](http://importblogkit.com/2015/07/does-not-work/)? –
删除选民可以解释他们的投票吗?在这里发布的答案似乎相当有帮助.... – user000001