gpt4 book ai didi

Flutter - 可拖动和缩放的小部件

转载 作者:行者123 更新时间:2023-12-05 05:30:22 25 4
gpt4 key购买 nike

所以对于这个应用程序(Windows、Web)我有两个要求:

  1. 用户可以将屏幕上的小部件拖动(拖放)到任何位置。
  2. 应用必须缩放到屏幕/窗口大小

对于 (1) 我使用了 this answer .对于 (2) 我使用了 this solution .

正如下面代码注释中提到的,我不能同时拥有:

如果我根据窗口大小动态设置 logicWidthlogicHeight,拖动工作正常但可拖动的小部件不会缩放,而是保持相同的大小,无论窗口大小。

如果我将 logicWidthlogicHeight 设置为一个常量值(当前 cleanHeight 的值),拖动将被其他人弄乱屏幕大小,但可拖动的小部件将随窗口大小正确缩放。

换句话说:为了使拖动能够很好地工作,这些值需要随时与窗口大小相匹配。但是通过更改这些值,我破坏了我需要的缩放比例。

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:matrix_gesture_detector/matrix_gesture_detector.dart';

//containing widgets to drag around
const List<Widget> draggableWidgets = [
DraggableWidget(
draggableWidget: CircleAvatar(
backgroundColor: Colors.green,
radius: 32,
)),
DraggableWidget(
draggableWidget: CircleAvatar(
backgroundColor: Colors.red,
radius: 24,
)),
];

class FrontPageWidget extends ConsumerWidget {
const FrontPageWidget({Key? key}) : super(key: key);
static const routeName = '/frontPage';

@override
Widget build(BuildContext context, WidgetRef ref) {
//screen height and padding
final height = MediaQuery.of(context).size.height;
final padding = MediaQuery.of(context).viewPadding;
// Height (without status and toolbar)
final cleanHeight = height - padding.top - kToolbarHeight;

//either make those values dynamic (cleanHeight updates depending on screen size / window size) OR constant (961px is the cleanHeight on full screen)
//if values are dynamic => the draggable widgets not scaling to screen size BUT dragging works fine
//if values are constant => the draggable widgets do scale to screen size BUT dragging is messed
final logicWidth = cleanHeight; //961
final logicHeight = cleanHeight; //961

return Scaffold(
appBar: AppBar(
title: const Text('Main Page'),
),
body: SizedBox.expand(
child: FittedBox(
fit: BoxFit.contain,
alignment: Alignment.center,
child: Container(
color: Colors.grey,
width: logicWidth,
height: logicHeight,
child: Stack(
children: draggableWidgets,
),
))),
);
}
}

class DraggableWidget extends StatelessWidget {
final Widget draggableWidget;
const DraggableWidget({Key? key, required this.draggableWidget})
: super(key: key);
@override
Widget build(BuildContext context) {
final ValueNotifier<Matrix4> notifier = ValueNotifier(Matrix4.identity());
return Center(
child: MatrixGestureDetector(
onMatrixUpdate: (m, tm, sm, rm) {
notifier.value = m;
},
child: AnimatedBuilder(
animation: notifier,
builder: (ctx, child) {
return Transform(
transform: notifier.value,
child: Center(
child: Stack(
children: [draggableWidget],
),
),
);
},
),
),
);
}
}

最佳答案

一种方法是将 draggableWidget 包装在 Transform 小部件中,并设置与尺寸相关的 scale 因子:

   child: AnimatedBuilder(
animation: notifier,
builder: (ctx, child) {
final height = MediaQuery.of(context).size.height;
return Transform(
transform: notifier.value,
child: Center(
child: Stack(
children: [
Transform.scale(
scale: height / 1000,
child: draggableWidget)
],
),
),
);
},
),

关于Flutter - 可拖动和缩放的小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74701876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com