【发布时间】:2020-11-20 09:06:16
【问题描述】:
我正在尝试构建一个简单的 Flutter 应用程序,它显示全屏背景图像并允许用户将某些小部件(即基本圆圈)从预定义的起始位置(以像素为单位)拖动到预定义的目标位置(也以像素为单位)。 TouchSurgery 应用程序的以下屏幕截图显示了与我尝试实现的设置非常相似的设置(绿色圆圈 = 起始位置,白色圆圈 = 目标位置):
此时我最担心的是不同的屏幕尺寸。假设我们有一台分辨率为750 x 1334 的iPhone SE(第二代)。我可以创建以下具有所需分辨率的背景图像,并随机确定所需的起始位置为坐标(430, 949)(为简单起见,我们可以忽略目标位置):
使用以下小部件,我可以在起点顶部渲染一个圆形Container:
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
var dpr = MediaQuery.of(context).devicePixelRatio;
return Scaffold(
body: Stack(
children: <Widget>[
Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/iPhoneSE.png"),
fit: BoxFit.fill,
),
),
),
Positioned(
left: 430 / dpr,
top: 949 / dpr,
child: Container(
width: 77.0 / dpr,
height: 77.0 / dpr,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.red,
),
),
),
],
),
);
}
}
生成的图像如下所示:
当我将AppBar 或BottomNavigationBar 添加到我的应用程序时,事情开始变得棘手。两个小部件的默认高度均为 56 像素。鉴于 iPhone SE 上的 devicePixelRatio 或 2,我需要将背景图像的大小裁剪为 750 x 1110 以使叠加层仍然准确 (1334 - 2 * 56 (AppBar) - 2 * 56 (BottomNavigationBar))。
对于 iPhone XR 等其他设备,情况变得更加复杂,还必须考虑安全区域的大小。对于 Android,还有更多不同的屏幕分辨率可供选择。
我现在的问题如下:不是为 20-30+ 不同的屏幕尺寸创建不同尺寸的背景图像,而是在 Flutter 中有更有效的方法在非常特定的屏幕位置绘制小部件,例如圆形 Container独立于实际屏幕尺寸工作?
【问题讨论】:
-
能不能把图片最小化,问题看很久了
-
你想在图像的特定位置画一个圆圈,对吧? IE。圆圈相对于图像的位置很重要,而不是相对于屏幕
-
正确,但是图像当然应该被绘制为背景图像,所以这个应该与屏幕尺寸相匹配