Проблема производительности при рисовании с использованием Path Flutter - PullRequest
0 голосов
/ 27 апреля 2020

Я тестирую производительность при рисовании с помощью 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...