Я тестирую производительность при рисовании с помощью Flutter. Я использую Путь, чтобы нарисовать линию между каждой точкой, обнаруженной Слушателем, потому что я прочитал, что производительность увеличится при ее использовании. Я использую Слушатель, потому что я попробовал также Apple Pencil на iPad 2017, изменив свойство kind на стилус.
Проблема в том, что я надеялся получить ответ в дизайне штрихов, похожий на заметность, он кажется очень медленнее, приемлемо, но не так сильно, как хотелось бы.
Поэтому я ищу советы по повышению производительности в плане скорости.
По следующей ссылке они рекомендовали использовать NotifyListener (), но я не понял, как поступить. Если это действительно улучшает производительность, я бы хотел, чтобы даже пример мог это реализовать. Если у Flutter есть какие-то ограничения, когда дело касается рисования пальцами или стилусом, дайте мне знать. проблема производительности при рисовании с использованием флаттера
import 'dart:io';
import 'dart:ui';
import 'package:flutter/material.dart';
class DrawWidget extends StatefulWidget {
@override
_DrawWidgetState createState() => _DrawWidgetState();
}
class _DrawWidgetState extends State<DrawWidget> {
Color selectedColor = Colors.black;
double strokeWidth = 3.0;
List<MapEntry<Path, Object>> pathList = List();
StrokeCap strokeCap = (Platform.isAndroid) ? StrokeCap.butt : StrokeCap.round;
double opacity = 1.0;
Paint pa = Paint();
@override
Widget build(BuildContext context) {
return Listener(
child: CustomPaint(
size: Size.infinite,
painter: DrawingPainter(
pathList: this.pathList,
),
),
onPointerDown: (details) {
if (details.kind == PointerDeviceKind.touch) {
print('down');
setState(() {
Path p = Path();
p.moveTo(details.localPosition.dx, details.localPosition.dy);
pa.strokeCap = strokeCap;
pa.isAntiAlias = true;
pa.color = selectedColor.withOpacity(opacity);
pa.strokeWidth = strokeWidth;
pa.style = PaintingStyle.stroke;
var drawObj = MapEntry<Path,Paint>(p, pa);
pathList.add(drawObj);
});
}
},
onPointerMove: (details) {
if (details.kind == PointerDeviceKind.touch) {
print('move');
setState(() {
pathList.last.key.lineTo(details.localPosition.dx, details.localPosition.dy);
});
}
},
/*onPointerUp: (details) {
setState(() {
});
},*/
);
}
}
class DrawingPainter extends CustomPainter {
DrawingPainter({this.pathList});
List<MapEntry<Path, Object>> pathList;
@override
void paint(Canvas canvas, Size size) {
for(MapEntry<Path, Paint> m in pathList) {
canvas.drawPath(m.key, m.value);
}
}
@override
bool shouldRepaint(DrawingPainter oldDelegate) => true;
}