如何在控件缩放后获取交互式查看器控件的大小。我使用translate的矩阵4,这是我从我transformationController,去结束点的小部件(右或左)上的按钮触摸,所以想停止在年底,但交互式视图是无限的方式。有什么方法可以得到画布的最后偏移量或大小吗?没有平移的平底锅和规模是工作罚款与有限的大小。
pvcm50d11#
创建一个GlobalKey来访问SizedBox的大小,并传递一个控制器给IneractiveViewer:
IneractiveViewer
GlobalKey _key = GlobalKey(); TransformationController _controller = TransformationController();
用InteractiveViewer.builder和SizedBox Package 较大的小部件。确保将_key传递给SizedBox:
InteractiveViewer.builder
SizedBox
SizeBox
InteractiveViewer.builder( controller:_controller, builder: (context, quad) { // Replace `yourWidget` with your actual widget return SizedBox(key: _key, child: yourWidget); },);
小部件构建完成后,您可以使用_key和RenderBox访问SizedBox的大小。您可以在小部件的生命周期中执行此操作,例如在initState中或在小部件布局后的callback中。
_key
RenderBox
initState
callback
double? widgetWidth = 1; double? widgetHeight = 1; _controller.addListener(() { double currentScale = _controller.value.getMaxScaleOnAxis(); WidgetsBinding.instance.addPostFrameCallback((_) { Size? size = myWidgetKey.currentContext?.size; widgetWidth = size?.width; widgetHeight = size?.height; }); print("Scale:$currentScale"); print( 'Widget Size: Width = ${(widgetWidth ?? 1) * currentScale}, Height = ${(widgetHeight ?? 1) * currentScale}'); });
这里有一个完整的代码为您的问题。
class MyInteractiveViewerWidget extends StatelessWidget { MyInteractiveViewerWidget({super.key}); final GlobalKey myWidgetKey = GlobalKey(); @override Widget build(BuildContext context) { TransformationController _controller = TransformationController(); double? widgetWidth = 1; double? widgetHeight = 1; _controller.addListener(() { double currentScale = _controller.value.getMaxScaleOnAxis(); WidgetsBinding.instance.addPostFrameCallback((_) { Size? size = myWidgetKey.currentContext?.size; widgetWidth = size?.width; widgetHeight = size?.height; }); print("Scale:$currentScale"); print( 'Widget Size: Width = ${(widgetWidth ?? 1) * currentScale}, Height = ${(widgetHeight ?? 1) * currentScale}'); }); return Scaffold( appBar: AppBar( title: const Text('Mehran Ullah Khan'), ), body: InteractiveViewer.builder( scaleEnabled: true, transformationController: _controller, builder: (context, quad) { return SizedBox( key: myWidgetKey, child: Column( children: [ for (var j = 1; j < 50; j++) Row( children: [ for (var i = 1; i < 50; i++) Container( margin: const EdgeInsets.all(2), width: 500, height: 300, ///get random color for container color: Color.fromARGB(255, i + 20, j + 30, j + 60)), ], ) ], ), ); }, ), ); } }
1条答案
按热度按时间pvcm50d11#
创建一个GlobalKey来访问SizedBox的大小,并传递一个控制器给
IneractiveViewer
:用
InteractiveViewer.builder
和SizedBox
Package 较大的小部件。确保将_key传递给SizedBox
:SizeBox
提供任何有界的高度或宽度 *小部件构建完成后,您可以使用
_key
和RenderBox
访问SizedBox
的大小。您可以在小部件的生命周期中执行此操作,例如在initState
中或在小部件布局后的callback
中。这里有一个完整的代码为您的问题。