问题描述
我正在使用 Flutter 创建一个笔记应用程序,我使用 CustomPainter 作为绘图部分。为了获得更好的性能,CustomPaint 在一些 Lines 之后被转换成一个图像。现在图像的问题是放大时,线条(现在是图像)非常像素化。如何在放大的同时保持良好的分辨率?我听说我可以在缩放时重新光栅化场景,或者从一开始就以高分辨率光栅化所有内容。
但是我如何使用颤振(重新)光栅化图像? 我正在下面添加我的应用程序的一些相关代码,如果缺少重要内容,请告诉我:
一切都用一个 layoutbuilder 包装,它提供了约束 + 像素比(比例):
LayoutBuilder(builder: (context,constraints) {
size = constraints.biggest;
scale = MediaQuery.of(context).devicePixelRatio;
我是如何进行缩放的:
GestureDetector(
onScaleStart: (details) {
_initialFocalPoint = details.focalPoint;
_initialScale = _scale;
},onScaleUpdate: (details) {
setState(() {
_sessionOffset =
details.focalPoint - _initialFocalPoint;
_scale = _initialScale * details.scale;
});
},onScaleEnd: (details) {
setState(() {
_offset += _sessionOffset;
_sessionOffset = Offset.zero;
});
},child: Transform.translate(
offset: _offset + _sessionOffset,child: Transform.scale(
scale: _scale,child: ....
我的 CustomPaint 出现在 Transform 小部件之后:
CustomPaint(
size: size!,willChange: true,painter: DrawingViewPainter(
pointsList: drawingNotifier.points,image: image
),);
带有 custpmpaint 到图像转换器的代码段(绘制的线被转换为图像以节省性能):
ui.PictureRecorder recorder = ui.PictureRecorder();
Canvas canvas = ui.Canvas(recorder);
canvas.scale(scale!);
DrawingViewPainter(image: image,pointsList: points).paint(canvas,size!);
ui.Picture picture = recorder.endRecording();
ui.Image newImage = await picture.toImage(
(size!.width * scale!).ceil(),(size!.height * scale!).ceil(),);
......
image = newImage
带有图像抽屉的 Custompaint 部分:
canvas.drawImageRect(
image!,Offset.zero & Size(image!.width.todouble(),image!.height.todouble()),Offset.zero & size,Paint());
}
(抱歉代码量太大)
如果你知道更好的方法,也请告诉我。 这是问题的视频: https://imgur.com/sFM9bMu
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)