flutter - 如何从元素的中心旋转堆栈?
问题描述
我有以下代码:
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(
home: Scaffold(
backgroundColor: Colors.grey,
body: SafeArea(
child: ImageRotate(),
),
),
);
}
}
class ImageRotate extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Transform.rotate(
angle: (math.pi / 180) * 45,
child: Stack(
children: [
Positioned(
top: 100,
left: 50,
child: Image.network(
"https://via.placeholder.com/300x200",
height: 200,
width: 300,
),
),
],
),
);
}
}
现在我期望的是像这样从图像中心执行旋转,
相反,它像这样旋转,
我还尝试研究变换原点。但是我自己无法弄清楚原点的偏移量。任何帮助,将不胜感激。
解决方案
您在尝试获取图像的位置时处于正确的方向(您还需要它的大小才能根据center的功能旋转)。
为了做到这一点,Flutter 中的经典方法是使用键。这是您使用此方法的问题:
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(
home: SafeArea(
child: Scaffold(
backgroundColor: Colors.grey,
body: ImageRotate(),
),
),
);
}
}
class ImageRotate extends StatefulWidget {
@override
_ImageRotateState createState() => _ImageRotateState();
}
class _ImageRotateState extends State<ImageRotate> {
final GlobalKey imageKey = GlobalKey();
Size imageSize = Size(0, 0);
Offset imagePos = Offset.zero;
@override
void initState() {
WidgetsBinding.instance.addPostFrameCallback((_) {
imageSize = (imageKey.currentContext.findRenderObject() as RenderBox).size;
imagePos =
(imageKey.currentContext.findRenderObject() as RenderBox).localToGlobal(Offset.zero);
setState(() {});
});
super.initState();
}
@override
Widget build(BuildContext context) {
print(imagePos);
print(imageSize);
return Transform.rotate(
angle: imagePos == Offset.zero ? 0 : (math.pi / 180) * 45,
origin:
-Offset(MediaQuery.of(context).size.width, MediaQuery.of(context).size.height) / 2 +
(imagePos + Offset(imageSize.width / 2, imageSize.height / 2)),
child: Stack(
children: [
Positioned(
top: 200,
left: 300,
child: Image.network(
"https://via.placeholder.com/300x200",
key: imageKey,
height: 100,
width: 100,
),
),
],
),
);
}
}
微积分解释:原点是中心的偏移量。这就是为什么您必须将其移动-Offset(MediaQuery.of(context).size.width, MediaQuery.of(context).size.height)/2
. 它将中心放在屏幕的左上角。然后你移动到图像的中心,所以在这里你使用从 GlobalKey 获得的尺寸:(imagePos + Offset(imageSize.width / 2, imageSize.height / 2))
imagePos == Offset.zero ? 0 : (math.pi / 180) * 45
解释:你必须先得到图像在没有旋转时的位置,所以你首先将旋转设置为零,然后计算imagePos,然后你可以应用你想要的旋转角度。
推荐阅读
- python - Spyder/Anaconda:如何停止内核并保存输出
- android - 从 GONE 更改为 VISIBLE 时查看混乱的点击
- python - 混合精度训练实施
- mysql - 如何在我的谷歌表格上以 blob 格式将图像存储到我的 mysql 数据库中?
- python - 使用正则表达式查找 url 的子字符串
- php - 如何将网站嵌入到 wordpress 页面中?
- laravel - Laravel 中的图片路径不正确
- android - 使用 javassist 注入代码时 Android 运行时崩溃
- powershell - 无法从 powershell 发送邮件
- x86 - 用表达式表示特定地址