Sie können einen Signaturbereich unter Verwendung von GestureDetector
zum Aufzeichnen von Berührungen und CustomPaint
zum Zeichnen auf dem Bildschirm erstellen. Hier sind ein paar Tipps:
- Verwenden
RenderBox.globalToLocal
die DragUpdateDetails
durch GestureDetector.onPanUpdate
in relativen Koordinaten
- Verwenden Sie eine
GestureDetector.onPanEnd
Geste Handler zur Verfügung gestellt konvertieren, um die Pausen zwischen den Schlägen aufzunehmen.
- Das Mutieren desselben
List
wird nicht automatisch ein Repaint auslösen, da die Konstruktorargumentegleich sind. Sie können ein Repaint auslösen, indem Sie jedes Mal, wenn ein neuer Punkt bereitgestellt wird, einen neuen List
erstellen.
- Verwenden Sie
Canvas.drawLine
, um eine gerundete Linie zwischen jedem der aufgezeichneten Punkte der Signatur zu zeichnen.
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()));
Wir entmutigen Beiträge, die einfach ein Problem aus dem Zusammenhang angeben, und erwarten, dass die Gemeinschaft, es zu lösen. Vorausgesetzt, Sie haben versucht, es selbst zu lösen und stecken geblieben, könnte es hilfreich sein, wenn Sie Ihre Gedanken geschrieben haben und was Sie nicht herausfinden konnten. Fügen Sie einen [mcve] Ihres Codes hinzu und beschreiben Sie, welche Probleme Sie haben. _ "Aber es funktioniert nicht" _ ist nicht sehr hilfreich. – Cerbrus
Ihr Programm [funktioniert nicht] (http://importblogkit.com/2015/07/does-not-work/)? –
Kann der Löschwähler seine Stimme erklären? Die hier gepostete Antwort scheint eher hilfreich zu sein ... – user000001