如何解决使用 GestureDetector 旋转对象并更新颤振中的值
我有以下几行代码,主要取自对 Rotate text or image using button gesture in flutter 个问题。
这里我有旋转轮胎,我可以旋转它,但我无法根据旋转方向更新 number 的值。
我想更新值,假设在向右旋转一次时增加 1,向左旋转一次时减少 1。
我尝试了很多方法,但仍然无法达到结果。
感谢任何帮助
import 'package:Flutter/gestures.dart';
import 'package:Flutter/material.dart';
class RotateText extends StatefulWidget {
RotateText({Key? key}) : super(key: key); // changed
@override
_RotateTextState createState() => _RotateTextState();
}
class _RotateTextState extends State<RotateText> {
double finalAngle = 0.0;
double offsetAngle = 0.0;
double number = 0;
@override
Widget build(BuildContext context) {
return _defaultApp(context);
}
_defaultApp(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,children: <Widget>[
Text('$number'),Container(
width: 250,height: 250,margin: EdgeInsets.all(30.0),child: LayoutBuilder(
builder: (context,constraints) {
return GestureDetector(
dragStartBehavior: DragStartBehavior.start,behavior: HitTestBehavior.translucent,onPanStart: (details) {
Offset centerOfGestureDetector = Offset(
constraints.maxWidth / 2,constraints.maxHeight / 2);
final touchPositionFromCenter =
details.localPosition - centerOfGestureDetector;
offsetAngle =
touchPositionFromCenter.direction - finalAngle;
},onPanUpdate: (details) {
Offset centerOfGestureDetector = Offset(
constraints.maxWidth / 2,constraints.maxHeight / 2);
final touchPositionFromCenter =
details.localPosition - centerOfGestureDetector;
setState(() {
finalAngle =
touchPositionFromCenter.direction - offsetAngle;
});
},child: Transform.rotate(
angle: finalAngle,child: Image.asset(
'assets/images/marked_tyre_base.png',fit: BoxFit.cover,),);
},)
],);
}
}
解决方法
你需要数学库
import 'dart:math';
添加一个参数
double oldFinalAngle = 0;
并更新onPanUpdate
onPanUpdate: (details) {
Offset centerOfGestureDetector = Offset(
constraints.maxWidth / 2,constraints.maxHeight / 2);
final touchPositionFromCenter =
details.localPosition - centerOfGestureDetector;
setState(() {
finalAngle =
touchPositionFromCenter.direction - offsetAngle;
finalAngle = finalAngle % (2 * pi);
if ((oldFinalAngle > ((3 / 2) * pi)) &&
(finalAngle < (pi / 2))) {
number++;
} else if ((finalAngle > ((3 / 2) * pi)) &&
(oldFinalAngle < (pi / 2))) {
number--;
}
oldFinalAngle = finalAngle;
});
},
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。