Как я могу увеличить в целевой точке? - PullRequest
0 голосов
/ 26 февраля 2020

Я работаю с флаттером, пытаясь заставить работать инструмент для рисования. Мне нужно иметь возможность масштабировать между двумя пальцами, чтобы рисовать детали в разы. Если я установлю точку увеличения на фиксированную точку экрана, это сработает, хотя и не всегда хорошо (центр экрана лучше). Однако я бы хотел, чтобы это было там, где всегда есть два пальца.

Поведение, которое я испытываю, когда пытаюсь сосредоточиться на двух пальцах, заключается в том, что он отрывается до того, как начинает масштабироваться. Если я оставлю цель увеличения в середине экрана, она будет работать.

Вот моя функция построения виджета (важная часть в любом случае):

@override
  Widget build(BuildContext context) {
    w = MediaQuery.of(context).size.width / 2;
    h = MediaQuery.of(context).size.height / 2;
    return Scaffold(
      body: Container(
        child: Stack( 
          children: <Widget>[
            Container( 
              child: Listener( 
                onPointerDown: (e) {
                  hand.addFinger(e);
                },
                onPointerMove: (e) {
                  hand.moveFinger(e);
                  setState(() {

                  });

                },
                onPointerUp: (e) {
                  hand.releaseFinger(e);

                  hand.washFingers();
                  setState(() {

                  });
                },
                onPointerCancel: (e) {
                  hand.washFingers();
                },
                child: CustomPaint( 
                  size: Size(MediaQuery.of(context).size.width, MediaQuery.of(context).size.height),
                  painter: _MyPainter(hand),
                ),
              ),
            )

Вот мои функции объекта руки Используется:

void addFinger(PointerDownEvent e) {
    if (this.s1 == null) {
      this.s1 = e.position;
    }
    else {
      this.s2 = e.position;
      center = MathStuff.average(s1, s2);
    }
  }

void moveFinger(PointerMoveEvent e) {
    if (e.pointer == this.i1) {
      this.e1 = e.position;
    }
    else {
      this.e2 = e.position;
      Offset starts = MathStuff.average(s1, s2);
      Offset ends = MathStuff.average(e1, e2);
      this.px -= (starts.dx - ends.dx) / zoom;
      this.py -= (starts.dy - ends.dy) / zoom;

      if (this.zs == null) {
        this.zs = MathStuff.distance(s2, s1);
      }
      else {
        this.ze = MathStuff.distance(e2, e1);
        this.zoom = (ze / zs) * za;
      }
      this.s2 = this.e2;
      this.s1 = this.e1;
    }

  }

void releaseFinger(PointerUpEvent e) {
    if (this.s2 != null) {
      this.zs = null;
      this.za = this.zoom;
    }
  }

Вот мой метод рисования:

@override
  void paint(Canvas canvas, Size size) {
    canvas.translate(hand.center.dx, hand.center.dy); 
    // canvas.translate(w, h); 
    canvas.scale(hand.zoom);
    // canvas.translate(-w, -h);
    canvas.translate(-hand.center.dx, -hand.center.dy);

    canvas.translate(hand.px, hand.py);


    // draw paths

    canvas.drawLine(Offset(100, 200), Offset(200, 400), PathPaint.getPathPaint(PathPaintEnum.GREEN));

  }

Я подхожу к этому неправильно или я что-то упустил?

...