Анимация Matrix4 некорректна в моей ситуации - PullRequest
0 голосов
/ 11 июля 2020

Привет, сообщество StackOverflow!

У меня проблема с Matrix4 animation во флаттере. Я пытаюсь сделать, когда вызываю onScaleEnd, запускаю матричную анимацию и с анимацией устанавливаю matrix4 var на «ноль».

Но у меня с этим проблемы. Я пытаюсь использовать функцию reset в controller, в onScaleStart для остановки и сброса анимации, но результат безумный.

У меня нет идей, как это сделать / исправить. И сделайте красивую анимацию.

Мне важна ваша помощь.

Код моего виджета:

import 'package:flutter/gestures.dart';
import 'package:flutter/rendering.dart';
import 'package:vector_math/vector_math_64.dart' as vec;
import 'package:flutter/animation.dart';

class MoveView extends StatefulWidget {
  final Widget child;
  final bool enableTranslate;
  final bool enableZoom;
  final bool enableReverseToRoot;

  const MoveView({
    Key key,
    @required this.child,
    this.enableTranslate = true,
    this.enableZoom = true,
    this.enableReverseToRoot = true,
  }) : super(key: key);

  @override
  _MoveViewState createState() => _MoveViewState();
}

class _MoveViewState extends State<MoveView> with SingleTickerProviderStateMixin {
  double scaleStart;
  vec.Vector3 transformStart;

  Matrix4 matrix4 = Matrix4.identity();
  Matrix4 animatedMatrix4 = Matrix4.identity();

  Matrix4Tween animation;
  AnimationController controller;

  @override
  void initState() {
    super.initState();

    this.matrix4.translate(20.0, 20.0, 0.0);

    controller = AnimationController(
      duration: Duration(milliseconds: 250), 
      vsync: this
    );

    this.animation = new Matrix4Tween(begin: this.animatedMatrix4, end: Matrix4.identity());
    animation.animate(controller)
      ..addListener(() {
        setState(() { 
          this.matrix4 = this.animation.evaluate(this.controller);
        }); 
        // NOTE: DEBUG
        print(this.matrix4);
    });
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onScaleStart: this.onScaleStart,
      onScaleUpdate: this.onScaleUpdate,
      onScaleEnd: this.onScaleEnd,
      child: ClipRRect(
        child: Container(
          color: Colors.transparent,
          transform: this.matrix4,
          child: this.widget.child
        )
      )
    );
  }

  vec.Vector3 _vectorFrom(Offset offset) {
    return vec.Vector3(offset.dx, offset.dy, 0);
  }

  void onScaleStart(ScaleStartDetails details) {
    // NOTE: DEBUG
    print("start");
    this.controller.reset();
    
    if (this.widget.enableTranslate) {
      this.transformStart = _vectorFrom(details.focalPoint);
    }
    if (this.widget.enableZoom)
      this.scaleStart = 1.000;
  }

  void onScaleUpdate(ScaleUpdateDetails details) {
    // NOTE: DEBUG
    print("upd");

    if (this.widget.enableTranslate)
      this.calculateTranslate(details.focalPoint);
    if (this.widget.enableZoom && details.scale != 1) 
      this.calculateScale(details.scale);

    // NOTE: DEBUG
    print(this.matrix4);
  }

  void onScaleEnd(ScaleEndDetails details) {
    this.controller.forward(from: 0.0);
  }

  void calculateTranslate(Offset offset) {
    vec.Vector3 transformCurrent = _vectorFrom(offset);

    setState(() {
      this.matrix4.translate(transformCurrent - this.transformStart);
    });

    this.transformStart = transformCurrent;
  }

  void calculateScale(double scale) {
    
    setState(() {
      this.matrix4.scale(scale / this.scaleStart);
    });

    this.scaleStart = scale;
  }

}

С уважением,

Roman S

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...