gpt4 book ai didi

canvas - Flutter - Canvas 绘制 Z 顺序

转载 作者:IT王子 更新时间:2023-10-29 07:05:45 25 4
gpt4 key购买 nike

使用 Flutter 的 CustomPainter绘制各种Image s 在 Canvas然后在屏幕上呈现。我的期望是任何绘制的重叠图像的深度顺序与它们在 Canvas 上绘制时的深度顺序相同(例如 canvas.drawImage(image1,..); canvas.drawImage(image2,..); canvas.drawImage(image3,..); 将在屏幕上呈现三个图像,其中 image1 分别出现在 image2image3 下方)。然而,我发现在某些情况下,渲染图像的顺序并未完全保留。

参见下面的示例代码:

import 'dart:async';
import 'dart:ui' as ui;
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter/services.dart' show rootBundle;

void main() => runApp(new ExampleApp());

class ExampleApp extends StatelessWidget {

@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Ground Example',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: ExampleScreen(),
);
}
}

class ExampleScreen extends StatefulWidget {
final Offset initPos = Offset(0.0, 0.0);

@override
_ExampleScreenState createState() => _ExampleScreenState();
}

class _ExampleScreenState extends State<ExampleScreen> {
ui.Image _image1;
ui.Image _image2;
ui.Image _image3;
bool _prepDone;

@override
void initState() {
_prepDone = false;
super.initState();
//_draggedToOffset = widget.initPos;
}

_ExampleScreenState() {
_prepare();
}

_prepare() {
loadImage('assets/wfw_1.png').then((image1) {
_image1 = image1;
}).whenComplete(() {
loadImage('assets/wnfw_2.png').then((image2) {
_image2 = image2;
}).whenComplete(() {
loadImage('assets/wfw_1.png').then((image3) {
_image3 = image3;
}).whenComplete(() {
_prepDone = true;
_handle();
});
});
});
}

_handle() {
setState(() {});
}

@override
Widget build(BuildContext context) {
return new Container(
constraints: BoxConstraints.expand(),
color: Colors.grey,
child: new Stack(children: <Widget>[
_prepDone ? Container(child: buildPainter()) : Container()
]));
}

buildPainter() {
return Container(
child: CustomPaint(
painter: ExamplePainter(_image1, _image2, _image3),
));
}
}

class ExamplePainter extends CustomPainter {
ui.Image _image1;
ui.Image _image2;
ui.Image _image3;
Paint _paint = Paint();

ExamplePainter(this._image1, this._image2, this._image3);

@override
void paint(Canvas canvas, Size size) {
canvas.drawImage(_image1, Offset(100.0, 35.0), _paint);
canvas.drawImage(_image2, Offset(70.0, 50.0), _paint);
canvas.drawImage(_image3, Offset(40.0, 65.0), _paint);
}

@override
bool shouldRepaint(ExamplePainter oldDelegate) {
return true;
}
}

Future<ui.Image> loadImage(String assetPath) async {
ImageStream stream = new AssetImage(assetPath, bundle: rootBundle)
.resolve(ImageConfiguration.empty);
Completer<ui.Image> completer = new Completer<ui.Image>();
void listener(ImageInfo frame, bool synchronousCall) {
final ui.Image image = frame.image;
completer.complete(image);
stream.removeListener(listener);
}

stream.addListener(listener);
return completer.future;
}

地点: image1image3是:wfw_1.png . image2是:wnfw_2.png

渲染输出在我的笔记本电脑的 Android Emulator 设备上如下:

rendered output

可以看出,image2呈现在最后绘制的图像( image3 )之上,而我期望它呈现在 image2 下面(即在 image1image3 之间)。

我能够解决该问题的唯一方法是:添加一个虚拟 drawRect(..)drawImage(..) 之间打电话调用或通过设置 image2Offset.dyoffset.dy+0.001 .

一般来说,我是 Dart 和 Flutter 的新手,所以我不确定是不是 a) 我的代码有误,b) 我对 Flutter 渲染引擎的理解有误,或者 c) dart:ui 某处的错误?

最佳答案

我认为是 c) 因为在更新到 flutter version 0.10.2 后,订单现在保持不变。

关于canvas - Flutter - Canvas 绘制 Z 顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53197508/

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