如何在 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,
),
)
),
);
我是 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,
),
)
),
);