Flutter 使用400多个小盒子优化可缩放网格
我创建了一些类似日历的东西,带有可点击的框,但由于框很多,Android上的性能很差(在iOS上没有这样的问题)。 我正在使用以下代码渲染整个过程:Flutter 使用400多个小盒子优化可缩放网格,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,我创建了一些类似日历的东西,带有可点击的框,但由于框很多,Android上的性能很差(在iOS上没有这样的问题)。 我正在使用以下代码渲染整个过程: ClipRect( child: PhotoView.customChild( customSize: Size(gridWidth, constraints.maxHeight),
ClipRect(
child: PhotoView.customChild(
customSize: Size(gridWidth, constraints.maxHeight),
child: GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 13,
mainAxisSpacing: 1.0,
crossAxisSpacing: 1.0,
childAspectRatio: 1),
itemCount: gridCreationHelperClass.boxWidgets.length,
physics: ClampingScrollPhysics(),
padding: const EdgeInsets.all(4.0),
itemBuilder: (BuildContext context, int index) {
return gridCreationHelperClass.boxWidgets[index];
},
),
minScale: 1.0,
//initialScale: 5.0,
backgroundDecoration: BoxDecoration(
color: Colors.transparent),
childSize: Size(gridWidth, constraints.maxHeight),
scaleChange: gridCreationHelperClass.scaleHasChanged,
)
这些BoxWidget可以是一个容器:
Container(
alignment: AlignmentDirectional.center,
color: color,
child: Text(showTextInBox ? text : "", style: TextStyle(fontSize: textInBoxSize,color: Colors.white,
fontFamily: getFontStatic(complexFont)), textAlign: TextAlign.center,)
或SVG:
Stack(children: <Widget>[
new SvgPicture.asset(
"images/squ.svg",
color: color,
),
Text(showTextInBox ? text : "", style: TextStyle(fontSize: textInBoxSize,color: Colors.white,
fontFamily: getFontStatic(complexFont)), textAlign: TextAlign.center,)
],alignment: AlignmentDirectional.center)
谢谢你的帮助 从未使用过photo_视图库,但非常确定您必须以某种方式缓存视图 查看这篇关于优化绘图的帖子。。。它可能会起作用:
从未使用过照片视图库,但可以肯定的是,您必须以某种方式缓存视图 查看这篇关于优化绘图的帖子。。。它可能会起作用:
仅在我的OnePlus 5T上出现问题,它在任何其他android手机上运行都非常平稳(仅使用容器,而不是SVG),即使是我50美元的中文测试手机和我最初的Sony Xperia Z安卓果冻豆。 我想OnePlus很奇怪
此外,目前我正在抛弃整个GridView并构建一个CustomPainter,即使在我的OP 5T+CustomPainter上调试时,它也能以60 fps的速度进行缩放和滚动,这给了我很大的自由度,我不必担心将来的颤振变化。好吧,它只在我的OnePlus 5T上有问题,运行非常平稳(仅使用容器,不使用SVG)在任何其他android手机上,即使是我50美元的中国测试手机和我最初的Sony Xperia Z安卓果冻豆。 我想OnePlus很奇怪
此外,目前我正在抛弃整个GridView并构建一个CustomPainter,即使在我的OP 5T+CustomPainter上调试时,它也能以60 fps的速度进行缩放和滚动,这给了我很大的自由度,而且我不必担心未来的颤振变化。因此,我采取了一种迄今为止似乎性能良好的不同方法。没有真正的ne为此,我们建议您使用外部PhotoView依赖项。最好只在您的状态中添加一个
双刻度;
,然后使用Flatter的内置手势检测器
:
GestureDetector(
onScaleUpdate: (ScaleUpdateDetails scaleDetails) {
setState(() {
_scale = scaleDetails.horizontalScale;
});
},
child: GridView.builder(
gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: max(1, (16 / _scale).floor())),
itemCount: _counter * 17,
itemBuilder: (BuildContext context, int index) {
return GridTile(
child: SvgPicture.asset('assets/image.svg'));
},
padding: const EdgeInsets.all(4.0),
),
),
看看这张照片,它看起来真的是面向可缩放/可平移的照片-无论如何,这不是你想要的网格布局。如果上面的内容不完全是你想要的,你可以通过在
网格视图周围放置一些容器并适当地使用你的状态来实现它。所以我拍了这张照片到目前为止,另一种方法似乎很有效。根本不需要为此使用外部PhotoView依赖项。最好只在您的状态中添加一个double\u scale;
,然后使用Flatter的内置GestureDetector
:
GestureDetector(
onScaleUpdate: (ScaleUpdateDetails scaleDetails) {
setState(() {
_scale = scaleDetails.horizontalScale;
});
},
child: GridView.builder(
gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: max(1, (16 / _scale).floor())),
itemCount: _counter * 17,
itemBuilder: (BuildContext context, int index) {
return GridTile(
child: SvgPicture.asset('assets/image.svg'));
},
padding: const EdgeInsets.all(4.0),
),
),
看看这张图片,它看起来真的是面向可缩放/可平移的照片-无论如何,这不是你想要的网格布局。如果上面的内容不是你想要的,你可以通过在网格视图
周围放置一些容器
并适当地使用你的状态来实现