Я работаю с флаттером, пытаясь заставить работать инструмент для рисования. Мне нужно иметь возможность масштабировать между двумя пальцами, чтобы рисовать детали в разы. Если я установлю точку увеличения на фиксированную точку экрана, это сработает, хотя и не всегда хорошо (центр экрана лучше). Однако я бы хотел, чтобы это было там, где всегда есть два пальца.
Поведение, которое я испытываю, когда пытаюсь сосредоточиться на двух пальцах, заключается в том, что он отрывается до того, как начинает масштабироваться. Если я оставлю цель увеличения в середине экрана, она будет работать.
Вот моя функция построения виджета (важная часть в любом случае):
@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));
}
Я подхожу к этому неправильно или я что-то упустил?