如何在 Flutter 的 Alignment(x,y) class 中获取 x 属性 的值?

How can I get the value of the x property in a Alignment(x,y) class in Flutter?

我是 Flutter 和 Dart 的新手。我使用在 Flutter 文档中找到的 example project 来构建我的应用程序。

这是代码:

import 'package:flutter/material.dart';
import 'package:flutter/physics.dart';

main() {
  runApp(MaterialApp(home: PhysicsCardDragDemo()));
}

class PhysicsCardDragDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: DraggableCard(
        child: FlutterLogo(
          size: 128,
        ),
      ),
    );
  }
}

/// A draggable card that moves back to [Alignment.center] when it's
/// released.
class DraggableCard extends StatefulWidget {
  final Widget child;
  DraggableCard({this.child});

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

class _DraggableCardState extends State<DraggableCard>
    with SingleTickerProviderStateMixin {
  AnimationController _controller;

  /// The alignment of the card as it is dragged or being animated.
  ///
  /// While the card is being dragged, this value is set to the values computed
  /// in the GestureDetector onPanUpdate callback. If the animation is running,
  /// this value is set to the value of the [_animation].
  Alignment _dragAlignment = Alignment.center;

  Animation<Alignment> _animation;

  /// Calculates and runs a [SpringSimulation].
  void _runAnimation(Offset pixelsPerSecond, Size size) {
    _animation = _controller.drive(
      AlignmentTween(
        begin: _dragAlignment,
        end: Alignment.center,
      ),
    );
    // Calculate the velocity relative to the unit interval, [0,1],
    // used by the animation controller.
    final unitsPerSecondX = pixelsPerSecond.dx / size.width;
    final unitsPerSecondY = pixelsPerSecond.dy / size.height;
    final unitsPerSecond = Offset(unitsPerSecondX, unitsPerSecondY);
    final unitVelocity = unitsPerSecond.distance;

    const spring = SpringDescription(
      mass: 30,
      stiffness: 1,
      damping: 1,
    );

    final simulation = SpringSimulation(spring, 0, 1, -unitVelocity);

    _controller.animateWith(simulation);
  }

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(vsync: this);

    _controller.addListener(() {
      setState(() {
        _dragAlignment = _animation.value;
      });
    });
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    final size = MediaQuery.of(context).size;
    return GestureDetector(
      onPanDown: (details) {
        _controller.stop();
      },
      onPanUpdate: (details) {
        setState(() {
          _dragAlignment += Alignment(
            details.delta.dx / (size.width / 2),
            details.delta.dy / (size.height / 2),
          );
        });
      },
      onPanEnd: (details) {
        _runAnimation(details.velocity.pixelsPerSecond, size);
      },
      child: Align(
        alignment: _dragAlignment,
        child: Card(
          child: widget.child,
        ),
      ),
    );
  }
}

除了位置之外,我正在尝试为 DraggableCard() 的其他属性设置动画;具体来说,我想根据水平拖动动态更改其旋转和不透明度。

为了做到这一点,我试图获取 _dragAlignment 的值,以便我可以将它提供给 Transform.rotate(),但该值对应于一个坐标,我只需要读取x坐标的值。

所以换句话说,我需要从对应于 _dragAlignment 的 class Alignment(x, y) 中提取 X 值。我尝试了很多东西,但没有任何效果。

我在这里和其他地方搜索了解决方案,但找不到任何帮助,也许我没有问正确的问题。

如果这是一个愚蠢的问题并且之前有人问过,我很抱歉。

我想你可以这样做,

var align = Alignment(1,2);
var xCoord = align.x;
var yCoord = align.y;
  

希望有用!

谢谢 Shri Hari 的帮助:)

我通过声明

解决了我的问题
var xCoord = 0.0;

其中还声明了 _dragAlignment 而不是使用

child: Transform.rotate(

                angle: -_dragAlignment.x/200

直接在 GestureDetector() 中。

我还必须编辑 onPanUpdate 中的值,因为它看起来不再拖动了,但您只需要增加 details.delta.dx...

像这样:

return GestureDetector(

  onPanDown: (details) {
    _controller.stop();
  },
  onPanUpdate: (details) {

    //print(_dragAlignment);
    setState(() {

      _dragAlignment += Alignment(

        details.delta.dx / (size.width / 300), // X drag sensitivity
        details.delta.dy / (size.height / 9), //Y drag sensitivity

      );
    });
  },
  onPanEnd: (details) {
    _runAnimation(details.velocity.pixelsPerSecond, size);
  },
  child: Align(
    alignment: _dragAlignment,
        child: Transform.rotate(

            angle: -_dragAlignment.x/200,
              child: Card(
                child: widget.child,
              ),
        )
  ),
);