Flutter 在颤振中使用手势检测器移动旋转图像
我有以下代码:Flutter 在颤振中使用手势检测器移动旋转图像,flutter,dart,Flutter,Dart,我有以下代码: import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'dart:math' as math; void main() { debugPaintSizeEnabled = true; return runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widge
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'dart:math' as math;
void main() {
debugPaintSizeEnabled = true;
return runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
backgroundColor: Colors.grey,
body: SafeArea(
child: TestComp(),
),
),
);
}
}
class TestComp extends StatefulWidget {
@override
_TestCompState createState() => _TestCompState();
}
class _TestCompState extends State<TestComp> {
double _y = 0;
double _x = 0;
@override
Widget build(BuildContext context) {
return Stack(
children: [
Positioned(
top: _y,
left: _x,
child: Transform.rotate(
angle: math.pi / 180 * 90,
child: Container(
height: 200,
width: 300,
color: Colors.black,
child: Stack(
children: <Widget>[
Positioned(
top: 0,
left: 0,
child: GestureDetector(
onPanUpdate: (details) {
var dx = details.delta.dx;
var dy = details.delta.dy;
setState(() {
_y += dy;
_x += dx;
});
},
child: Image.network("https://via.placeholder.com/300x200"),
),
),
],
),
),
),
),
],
);
}
}
导入“包装:颤振/材料.省道”;
导入“package:flatter/rendering.dart”;
导入'dart:math'作为数学;
void main(){
debugPaintSizeEnabled=true;
返回runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
debugShowCheckedModeBanner:false,
家:脚手架(
背景颜色:颜色。灰色,
正文:安全区(
子项:TestComp(),
),
),
);
}
}
类TestComp扩展StatefulWidget{
@凌驾
_TestCompState createState();
}
类_TestCompState扩展状态{
双y=0;
double x=0;
@凌驾
小部件构建(构建上下文){
返回堆栈(
儿童:[
定位(
顶部:_y,
左:x,
子对象:Transform.rotate(
角度:math.pi/180*90,
子:容器(
身高:200,
宽度:300,
颜色:颜色,黑色,
子:堆栈(
儿童:[
定位(
排名:0,
左:0,,
儿童:手势检测器(
onPanUpdate:(详细信息){
var dx=details.delta.dx;
var dy=details.delta.dy;
设置状态(){
_y+=dy;
_x+=dx;
});
},
子项:Image.network(“https://via.placeholder.com/300x200"),
),
),
],
),
),
),
),
],
);
}
}
基本上,功能是使图像可拖动。但当我旋转它并试图移动图像时,坐标会被弄乱。它没有朝正确的方向移动。当角度为0时,它可以完美地工作。任何帮助都将不胜感激。颤振坐标结构的工作原理略有不同。我找不到一个明确的url,但在您的情况下,值的变化如下。您可以尝试代码示例。要更改角度,可以将“贴图”中的另一个角度指定为“selectedAngle”
导入“包装:颤振/材料.省道”;
导入“package:flatter/rendering.dart”;
导入'dart:math'作为数学;
void main(){
debugPaintSizeEnabled=true;
返回runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
debugShowCheckedModeBanner:false,
家:脚手架(
背景颜色:颜色。灰色,
正文:安全区(
子项:TestComp(),
),
),
);
}
}
类TestComp扩展StatefulWidget{
@凌驾
_TestCompState createState();
}
类_TestCompState扩展状态{
双y=0;
double x=0;
地图={
0:0.0,//相同的360度角
90:math.pi/180*90,
180:math.pi/180*180,
270:math.pi/180*270,
};
int selectedAngle=270;
@凌驾
小部件构建(构建上下文){
返回堆栈(
儿童:[
定位(
顶部:_y,
左:x,
子对象:Transform.rotate(
角度:贴图[所选角度],
子:容器(
身高:200,
宽度:300,
颜色:颜色,黑色,
子:堆栈(
儿童:[
定位(
排名:0,
左:0,,
儿童:手势检测器(
onPanUpdate:(详细信息){
var dx=details.delta.dx;
var dy=details.delta.dy;
var结果=计算(dx,dy);
设置状态(){
_y+=结果['y'];
_x+=结果['x'];
});
},
子项:Image.network(“https://via.placeholder.com/300x200"),
),
),
],
),
),
),
),
],
);
}
地图计算(双x,双y){
开关(选择角度){
案例(0):
返回{'x':x,'y':y};
打破
案件(90):
返回{'x':-y'y':x};
打破
案件(180):
返回{'x':-x,'y':-y};
打破
案件(270):
返回{x':y,'y':-x};
打破
违约:
返回{'x':x,'y':y};
打破
}
}
}
您可以复制粘贴运行下面的完整代码您可以向下移动
变换。旋转以包裹图像。网络
请参见下面的工作演示
代码片段
Transform.rotate(
angle: math.pi / 180 * 90,
child: Image.network(
"https://via.placeholder.com/300x200")),
),
工作演示
完整代码
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'dart:math' as math;
void main() {
debugPaintSizeEnabled = true;
return runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
backgroundColor: Colors.grey,
body: SafeArea(
child: TestComp(),
),
),
);
}
}
class TestComp extends StatefulWidget {
@override
_TestCompState createState() => _TestCompState();
}
class _TestCompState extends State<TestComp> {
double _y = 0;
double _x = 0;
@override
Widget build(BuildContext context) {
return Stack(
children: [
Positioned(
top: _y,
left: _x,
child: Container(
height: 200,
width: 300,
color: Colors.black,
child: Stack(
children: <Widget>[
Positioned(
top: 0,
left: 0,
child: GestureDetector(
onPanUpdate: (details) {
var dx = details.delta.dx;
var dy = details.delta.dy;
setState(() {
_y += dy;
_x += dx;
});
},
child: Transform.rotate(
angle: math.pi / 180 * 90,
child: Image.network(
"https://via.placeholder.com/300x200")),
),
),
],
),
),
),
],
);
}
}
导入“包装:颤振/材料.省道”;
导入“package:flatter/rendering.dart”;
导入'dart:math'作为数学;
void main(){
debugPaintSizeEnabled=true;
返回runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
debugShowCheckedModeBanner:false,
家:脚手架(
背景颜色:颜色。灰色,
正文:安全区(
子项:TestComp(),
),
),
);
}
}
类TestComp扩展StatefulWidget{
@凌驾
_TestCompState createState();
}
类_TestCompState扩展状态{
双y=0;
double x=0;
@凌驾
小部件构建(构建上下文){
返回堆栈(
儿童:[
定位(
顶部:_y,
左:x,
子:容器(
身高:200,
宽度:300,
颜色:颜色,黑色,
子:堆栈(
儿童:[
定位(
排名:0,
左:0,,
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'dart:math' as math;
void main() {
debugPaintSizeEnabled = true;
return runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
backgroundColor: Colors.grey,
body: SafeArea(
child: TestComp(),
),
),
);
}
}
class TestComp extends StatefulWidget {
@override
_TestCompState createState() => _TestCompState();
}
class _TestCompState extends State<TestComp> {
double _y = 0;
double _x = 0;
@override
Widget build(BuildContext context) {
return Stack(
children: [
Positioned(
top: _y,
left: _x,
child: Container(
height: 200,
width: 300,
color: Colors.black,
child: Stack(
children: <Widget>[
Positioned(
top: 0,
left: 0,
child: GestureDetector(
onPanUpdate: (details) {
var dx = details.delta.dx;
var dy = details.delta.dy;
setState(() {
_y += dy;
_x += dx;
});
},
child: Transform.rotate(
angle: math.pi / 180 * 90,
child: Image.network(
"https://via.placeholder.com/300x200")),
),
),
],
),
),
),
],
);
}
}