觀察,python
GestureDetector( child: CustomPaint(painter: StudyPaint(points: _points)), onPanEnd: (DragEndDetails details)=>_points.add(null), onPanUpdate: (DragUpdateDetails details){ var a = details.globalPosition; RenderBox referenceBox = context.findRenderObject(); Offset localPosition = referenceBox.globalToLocal(details.globalPosition); print('a: $a, localposition: $localPosition'); setState(() { _points = List.from(_points)..add(localPosition); }); }, ),
減了3個 hcanvas
import 'package:flutter/material.dart'; main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return MaterialApp( home: HomePage(), ); } } class HomePage extends StatefulWidget { @override State<StatefulWidget> createState() { // TODO: implement createState return HomePageState(); } } class HomePageState extends State<HomePage> { List<Offset> _points = <Offset>[]; @override Widget build(BuildContext context) { // print(_points); var h = MediaQuery.of(context).padding.top; var b = MediaQuery.of(context).padding.bottom; // print('h: $h, b: $b'); return Scaffold( appBar: AppBar(title: Text('Painter'),), body: Container( width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.height-h, child: Stack( children: <Widget>[ GestureDetector( // child: onPanEnd: (DragEndDetails details)=>_points.add(null), onPanUpdate: (DragUpdateDetails details){ var a = details.globalPosition; var x = Offset(a.dx, a.dy-h-h-h); RenderBox referenceBox = context.findRenderObject(); Offset localPosition = referenceBox.globalToLocal(details.globalPosition); // print('a: $a, x: $x, localposition: $localPosition'); setState(() { _points = List.from(_points)..add(x); }); }, ), CustomPaint(painter: StudyPaint(points: _points)), ], ) ), ); } } class StudyPaint extends CustomPainter { StudyPaint({this.points}); List<Offset> points; @override void paint(Canvas canvas, Size size) { print(points); Paint paint = Paint() ..color = Colors.blue ..strokeCap = StrokeCap.round ..isAntiAlias = true ..strokeJoin = StrokeJoin.bevel ..strokeWidth = 12.0; for(int i=0; i<points.length; i++){ if(points[i]!=null && points[i+1]!=null) canvas.drawLine(points[i], points[i+1], paint); } } @override bool shouldRepaint(StudyPaint other) => other.points!=points; }
import 'package:flutter/material.dart'; main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return MaterialApp( home: HomePage(), ); } } class HomePage extends StatefulWidget { @override State<StatefulWidget> createState() { // TODO: implement createState return HomePageState(); } } class HomePageState extends State<HomePage> { List<Offset> _points = <Offset>[]; @override Widget build(BuildContext context) { // print(_points); var h = MediaQuery.of(context).padding.top; print('h: $h'); return Scaffold( appBar: AppBar(title: Text('Painter'),), body: Center( child: Container( width: double.infinity, height: double.infinity, child: GestureDetector( child: CustomPaint(painter: StudyPaint(points: _points)), onPanEnd: (DragEndDetails details)=>_points.add(null), onPanUpdate: (DragUpdateDetails details){ var a = details.globalPosition; RenderBox referenceBox = context.findRenderObject(); Offset localPosition = referenceBox.globalToLocal(details.globalPosition); print('a: $a, localposition: $localPosition'); setState(() { _points = List.from(_points)..add(localPosition); }); }, ), ), ), ); } } class StudyPaint extends CustomPainter { StudyPaint({this.points}); List<Offset> points; @override void paint(Canvas canvas, Size size) { Paint paint = Paint() ..color = Colors.blue ..strokeCap = StrokeCap.round ..isAntiAlias = true ..strokeWidth = 12.0 ..strokeJoin = StrokeJoin.bevel; for(int i=0; i<points.length; i++){ if(points[i]!=null && points[i+1]!=null) canvas.drawLine(points[i], points[i+1], paint); } } @override bool shouldRepaint(StudyPaint other) => other.points!=points; }