Flutter 缩放中的性能问题
我创建了Myapp类和Panner类,用于在Flatter中缩放、滚动和平移图像。我在缩放图像时遇到问题Flutter 缩放中的性能问题,flutter,dart,Flutter,Dart,我创建了Myapp类和Panner类,用于在Flatter中缩放、滚动和平移图像。我在缩放图像时遇到问题 import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:zoomexample/Panner.dart'; void main() => runApp(MyApp()); class MyApp extend
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:zoomexample/Panner.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
showPerformanceOverlay: true,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home:
Scaffold(appBar: AppBar(title: Text("Zoom view",)),body:Center(child: Panner(),))
);
}
}
panner class
import 'dart:typed_data';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
class Panner extends StatefulWidget {
@override
State<StatefulWidget> createState() => PannerState();
}
class PannerState extends State<Panner> {
String assets ;
Uint8List pageData;
double scrollPosx=0,scrollPosy=0,previousPosx=0,previousPosy=0;
double scale = 1.0, previousScale = 1.0;
double originalImageHeight, imageHeight;
Offset _offset = Offset.zero;
Offset _previousOffset, _startingFocalPoint;
ScrollController _verticalController = ScrollController();
ScrollController _horizontalController = ScrollController();
_findPosition()
{
_previousOffset=Offset(-scrollPosx,-scrollPosy);
previousPosx=-scrollPosx;
previousPosy=-scrollPosy;
}
}
Future _getImage(BuildContext context) async {
if(pageData == null)
{
assets = 'images/squirrel.jpg';
imageHeight = originalImageHeight = MediaQuery.of(context).size.height;
pageData = ((await rootBundle.load(assets)).buffer.asUint8List());
}
}
_onScaleUpdate(ScaleUpdateDetails details) {
scale = details.scale * previousScale;
if(scale!=1.0) {
if (scale < 0.5) {
scale = 0.5;
}
imageHeight = originalImageHeight * scale;
setState(() {});
final Offset normalizedOffset = (_startingFocalPoint -
_previousOffset) / previousScale;
_offset = details.focalPoint - normalizedOffset * scale;
_horizontalController.jumpTo(-_offset.dx);
_verticalController.jumpTo(-_offset.dy);
}
}
_onScaleStart(ScaleStartDetails details) {
_startingFocalPoint = details.focalPoint;
previousScale = scale;
_previousOffset = _offset;
scrollPosx=_horizontalController.position.pixels;
scrollPosy=_verticalController.position.pixels;
if(previousPosx!=scrollPosx || previousPosy!=scrollPosy)
{
_findPosition();
}
setState(() {});
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: _getImage(context),
builder: (context, snapshot) {
if(pageData==null)
{
return CircularProgressIndicator();
}
return GestureDetector(
onScaleStart: _onScaleStart,
onScaleUpdate: _onScaleUpdate,
// onScaleEnd: _onScaleEnd,
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
controller: _horizontalController,
child: SingleChildScrollView(
scrollDirection: Axis.vertical,
controller: _verticalController,
child: Align(
alignment: FractionalOffset.center,
child: Image.memory(
pageData,
height: imageHeight,
fit: BoxFit.cover,
width: imageWidth,
),
)
),
)
) ;
});
}
}
进口“包装:颤振/材料.省道”;
进口“包装:颤振/cupertino.dart”;
导入“package:zoomexample/Panner.dart”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
showPerformanceOverlay:正确,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:
脚手架(appBar:appBar(标题:文本(“缩放视图”),主体:中心(子项:Panner(),))
);
}
}
潘纳级
导入“dart:键入的_数据”;
导入“package:flatter/signatures.dart”;
进口“包装:颤振/材料.省道”;
进口“包装:颤振/cupertino.dart”;
导入“包:flifter/services.dart”;
类Panner扩展了StatefulWidget{
@凌驾
State createState()=>PannerState();
}
类PannerState扩展了状态{
串资产;
UINT8列表页面数据;
双scrollPosx=0,scrollPosy=0,previousPosx=0,previousPosy=0;
双刻度=1.0,以前的刻度=1.0;
双源图像高度、图像高度;
偏移量_Offset=Offset.0;
偏移量_先前的偏移量,_起始焦点;
ScrollController_verticalController=ScrollController();
ScrollController_horizontalController=ScrollController();
_findPosition()
{
_previousOffset=偏移(-scrollPosx,-scrollPosy);
previousPosx=-scrollPosx;
previousPosy=-scrollPosy;
}
}
Future\u getImage(BuildContext上下文)异步{
如果(pageData==null)
{
资产='images/squirrel.jpg';
imageHeight=originalImageHeight=MediaQuery.of(context).size.height;
pageData=((wait rootBundle.load(assets)).buffer.asUint8List());
}
}
_onScaleUpdate(缩放更新详细信息){
比例=细节。比例*以前的比例;
如果(比例!=1.0){
如果(刻度<0.5){
比例=0.5;
}
图像高度=原始图像高度*比例;
setState((){});
最终偏移量规格化偏移量=(_startingFocalPoint-
_上一个偏移量)/上一个刻度;
_偏移=细节。焦点-规格化偏移*比例;
_水平控制器.跳到(-u offset.dx);
_垂直控制器。跳到(-U偏移量dy);
}
}
_onScaleStart(ScaleStartDetails){
_startingFocalPoint=详细信息。focalPoint;
以前的比例=比例;
_上一个偏移量=_偏移量;
scrollPosx=_horizontalController.position.pixels;
scrollPosy=_verticalController.position.pixels;
如果(previousPosx!=scrollPosx | | previousPosy!=scrollPosy)
{
_findPosition();
}
setState((){});
}
@凌驾
小部件构建(构建上下文){
回归未来建设者(
未来:_getImage(上下文),
生成器:(上下文,快照){
如果(pageData==null)
{
返回循环ProgressIndicator();
}
返回手势检测器(
onScaleStart:\u onScaleStart,
onScaleUpdate:\u onScaleUpdate,
//onScaleEnd:_onScaleEnd,
子:SingleChildScrollView(
滚动方向:轴水平,
控制器:_水平控制器,
子:SingleChildScrollView(
滚动方向:轴垂直,
控制器:_垂直控制器,
子对象:对齐(
对齐:分馏loffset.center,
孩子:图像。记忆(
页面数据,
高度:图像高度,
适合:BoxFit.cover,
宽度:图像宽度,
),
)
),
)
) ;
});
}
}
对于缩放图像,我使用手势检测器。缩放图像时,它无法顺利工作,多指缩放几次都无法正确响应,当多指缩放在当时没有响应时,控制台指示应用程序可以在其主线程上执行太多的工作。请提前感谢如果日志没有显示任何错误,则很可能是因为您处于调试模式,这会显著降低性能,以便为您提供调试功能。尝试构建发布版本,看看问题是否仍然存在。我以发布模式构建应用程序。我仍然面临着缩放的问题。当我缩放一幅图像时,它的响应不正常