Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 在颤振中使用手势检测器移动旋转图像_Flutter_Dart - Fatal编程技术网

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")),
                  ),
                ),
              ],
            ),
          ),
        ),
      ],
    );
  }
}