Flutter 颤振-集装箱内的自定义绘图签名不起作用
我正在使用下面的代码,我在搜索堆栈溢出时发现了关于将签名保存为自定义图形的想法。我做了一个评论中提到的小改动,现在我可以画画了,但是。。。它绘制在整个屏幕上,而不是我想要的框内。我还想将此图像保存为base64格式,但那是在我使白色区域包含签名之后Flutter 颤振-集装箱内的自定义绘图签名不起作用,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,我正在使用下面的代码,我在搜索堆栈溢出时发现了关于将签名保存为自定义图形的想法。我做了一个评论中提到的小改动,现在我可以画画了,但是。。。它绘制在整个屏幕上,而不是我想要的框内。我还想将此图像保存为base64格式,但那是在我使白色区域包含签名之后 [![import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:sitereport/Constants/C
[![import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:sitereport/Constants/Constants.dart';
class Signature extends StatefulWidget {
@override
_SignatureState createState() => _SignatureState();
}
class _SignatureState extends State<Signature> {
List<Offset> _points = <Offset>\[\];
@override
void initState() {
// TODO: implement initState
super.initState();
SystemChrome.setPreferredOrientations(\[
DeviceOrientation.portraitUp,
\]);
}
@override
void dispose() {
// TODO: implement dispose
SystemChrome.setPreferredOrientations(\[
DeviceOrientation.landscapeRight,
DeviceOrientation.landscapeLeft,
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
\]);
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.grey\[700\],
body: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>\[
Container(
width: double.infinity,
height: 200,
decoration: BoxDecoration(
boxShadow: \[
BoxShadow(
color: constructionOrange,
offset: Offset(0.1, 1.0),
blurRadius: 5.0,
spreadRadius: 1.0)
\],
color: Colors.white,
),
child: Stack(
children: \[
GestureDetector(
onPanUpdate: (DragUpdateDetails details) {
RenderBox referenceBox = context.findRenderObject();
Offset localPosition =
referenceBox.globalToLocal(details.globalPosition);
setState(() {
_points = new List.from(_points)..add(details.localPosition); //Using local position above was drawing below the white area
});
},
onPanEnd: (DragEndDetails details) => _points.add(null),
),
CustomPaint(painter: SignaturePainter(_points))
\],
),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>\[
GestureDetector( // SAVE BUTTON
child: Container(
margin: EdgeInsets.symmetric(
horizontal: 10.0, vertical: 20.0),
padding: EdgeInsets.symmetric(
horizontal: 25.0, vertical: 10.0),
child: Center(
child: Text(
'SAVE',
style: TextStyle(
fontSize: 15.0, color: Colors.white),
)),
decoration: BoxDecoration(
color: darkYellow,
borderRadius:
BorderRadius.all(Radius.circular(10.0)),
gradient: GRADIENT,
),
),
onTap: () {
},
),
GestureDetector( //CLEAR BUTTON
child: Container(
margin: EdgeInsets.symmetric(
horizontal: 10.0, vertical: 10.0),
padding: EdgeInsets.symmetric(
horizontal: 25.0, vertical: 10.0),
child: Center(
child: Text(
'CLEAR',
style: TextStyle(
fontSize: 15.0, color: Colors.white),
)),
decoration: BoxDecoration(
color: darkYellow,
borderRadius:
BorderRadius.all(Radius.circular(10.0)),
gradient: GRADIENT,
),
),
onTap: () {
setState(() {
_points.clear();
});
},
)
\],
)
\],
),
);
}
}
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 = 4.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;
}][1]][1]
[![import'包装:flatter/material.dart';
导入“包:flifter/services.dart”;
导入“包:sitereport/Constants/Constants.dart”;
类签名扩展了StatefulWidget{
@凌驾
_SignatureEstate createState()=>\u SignatureEstate();
}
类签名扩展状态{
列出_点=\[\];
@凌驾
void initState(){
//TODO:实现initState
super.initState();
SystemChrome.setPreferredOrientations(\[
DeviceOrientation.Up,
\]);
}
@凌驾
无效处置(){
//TODO:实现dispose
SystemChrome.setPreferredOrientations(\[
设备定向,景观权,
DeviceOrientation.landscapeLeft,
DeviceOrientation.Up,
DeviceOrientation.down,
\]);
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
背景颜色:颜色。灰色\[700\],
正文:专栏(
crossAxisAlignment:crossAxisAlignment.stretch,
mainAxisAlignment:mainAxisAlignment.center,
儿童:\[
容器(
宽度:double.infinity,
身高:200,
装饰:盒子装饰(
boxShadow:\[
箱形阴影(
颜色:构造范围,
偏移量:偏移量(0.1,1.0),
半径:5.0,
扩展半径:1.0)
\],
颜色:颜色,白色,
),
子:堆栈(
儿童:\[
手势检测器(
onPanUpdate:(DragUpdate详细信息){
RenderBox referenceBox=context.findEnderObject();
偏移本地位置=
参考框。全局颜色(详细信息。全局位置);
设置状态(){
_点=新列表。从(_点)…添加(details.localPosition);//使用上面的本地位置在白色区域下方绘制
});
},
onPanEnd:(DragEndDetails)=>\u points.add(null),
),
CustomPaint(油漆工:SignaturePainter(_点))
\],
),
),
划船(
mainAxisAlignment:mainAxisAlignment.space,
儿童:\[
手势检测器(//保存按钮
子:容器(
边距:边缘组。对称(
水平:10.0,垂直:20.0),
填充:EdgeInsets.symmetric(
水平:25.0,垂直:10.0),
儿童:中心(
子:文本(
“保存”,
样式:TextStyle(
字体大小:15.0,颜色:彩色。白色),
)),
装饰:盒子装饰(
颜色:暗黄色,
边界半径:
边界半径所有(半径圆形(10.0)),
梯度:梯度,
),
),
onTap:(){
},
),
手势检测器(//清除按钮
子:容器(
边距:边缘组。对称(
水平:10.0,垂直:10.0),
填充:EdgeInsets.symmetric(
水平:25.0,垂直:10.0),
儿童:中心(
子:文本(
“清楚”,
样式:TextStyle(
字体大小:15.0,颜色:彩色。白色),
)),
装饰:盒子装饰(
颜色:暗黄色,
边界半径:
边界半径所有(半径圆形(10.0)),
梯度:梯度,
),
),
onTap:(){
设置状态(){
_点。清除();
});
},
)
\],
)
\],
),
);
}
}
类SignaturePainter扩展了CustomPainter{
签名页(此点);
最后列出的要点;
空心油漆(帆布,尺寸){
油漆=新油漆()
…颜色=颜色
..strokeCap=strokeCap.round
..冲程宽度=4.0;
对于(int i=0;iother.points!=点;
}][1]][1]
使用clipRect()
内部绘制(画布,大小)
method谢谢。canvas.clipRect()要求一个参数,那会是什么?aRect
您想剪裁所有的绘图代码-在该Rect之外绘制的所有内容都将不可见您是否介意详细说明它是如何作为一行代码完成的?我有一个高度为200,宽度为2倍的容器。我想在其中“容纳”这个Offset.zero&size