当前位置: 首页 > 知识库问答 >
问题:

什么是canvas.save和canvas.restore?

吕和风
2023-03-14

我想知道为什么以及何时使用canvas.savecanvas.restore,甚至可能使用canvas.saveLayer
我听说它们确实很有用,但我不知道何时使用它们。

共有1个答案

丁震博
2023-03-14

canvas.savecanvas.saveLayer的工作方式略有不同,但它们都具有相同的对应关系:

这允许您恢复保存堆栈上最近的条目之前的状态,即它“弹出当前保存堆栈”。这意味着在当前状态下对画布所做的任何转换和剪辑都将被删除,如果使用了saveLayer,则保存的层将被合成到画布中(绘制顺序将保持不变)。

正如我前面提到的,这允许您保存画布所处的状态。您可以执行所需的任何转换和剪辑,这些转换和剪辑将使用restore删除:

canvas.save();

canvas.transform(..); // Transforms the canvas, which will affect the draw call.
canvas.drawRect(...); // Affected by the transform.

canvas.restore();

canvas.drawRect(...); // Not affected by the transform.

请注意,RenderObject的所有子级将使用相同的PaintingContext,即相同的Canvas。因此,如果您在单个子级中转换画布,它也将为随后绘制的所有其他子级进行转换。这可能是不需要的行为,也是您总是希望保存还原画布状态的原因。

这有点复杂,我敦促您阅读此方法的全面文档。顺便说一句,截至2019年1月,savelayer在Flutter web中不起作用。

savelayersave之间的基本区别在于,savelayer将在使用restore时合成层。对于一个简单的示例,我构造了这个没有bounds(这就是为什么传递null)的代码段,这将保存整个画布:

canvas.drawRect(rect, Paint()..color = const Color(0xffff0000)); // Draws a red rect.
canvas.saveLayer(null, Paint()..blendMode = BlendMode.multiply); // Saves the whole canvas.

canvas.drawRect(
  rect.shift(const Offset(20, 20)),
  Paint()..color = const Color(0xff0000ff), // Draws a blue rect.
);

canvas.restore(); // Composites the red rect into the blue rect.

这是没有savelayer的示例的样子:

 类似资料:
  • 问题内容: 我做了 我试图弄清楚输出,可以看到很多共享库都按预期映射到了内存映射段。 到最后有类似的东西 是什么和意味着什么?是vsyscall内存的内核部分吗?如果有人可以在这个问题上有所启发,那就太好了。 问题答案: 该 vsyscall 和 VDSO 段用于加速Linux的某些系统调用的机制。例如,通常是通过此机制调用的。引入的第一个机制是 vsyscall ,它是作为执行特定系统调用的一种

  • 问题内容: 有人能说明一下JVM选项是什么和是谁?具体来说,何时/为什么要更改?如何确定合适的尺寸? 这就是文档所说的: -XX:ReservedCodeCacheSize = 32m保留的代码缓存大小(以字节为单位)-最大代码缓存大小。[Solaris 64位,amd64和-server x86:2048m;在1.5.0_06和更早版本中,Solaris 64位和and64:1024m。] 问题

  • 问题内容: 我是CSS的初学者,而前几天我在看一些CSS代码时,发现了以下几行。在我以前学习CSS的教程中,我从未见过像这些行这样的内容。有人可以向我解释这些内容吗?或者给我一个可以学习实现这些内容的资源? 问题答案: 这些是相关渲染引擎(适用于Chrome,Safari;适用于Firefox,适用于Opera,适用于Internet Explorer)提供的供应商前缀属性。通常,在W3最终澄清/

  • 什么是BIOS 系统开机启动 BIOS,即微机的基本输入输出系统(BasicInput-Output System),是集成在主板上的一个ROM芯片,其中保存有微机系统最重要的基本输入/输出程序、系统信息设置、开机上电自检程序和系统启动自举程序。在主板上可以看到BIOSROM芯片,请参见微机主板图。一块主板性能优越与否,很大程度上取决于板上的BIOS管理功能是否先进。 一、BIOS中断例程 即BI

  • 我做了 我试图理解输出的意义。我可以看到许多共享库按照预期映射到内存映射段。 接近尾声的时候会有类似的东西 vdso和vsyscall是什么意思?vsyscall是内存的内核部分吗?如果有人能解释一下这个问题,那就太好了。

  • 本文向大家介绍什么是KVC和KVO?相关面试题,主要包含被问及什么是KVC和KVO?时的应答技巧和注意事项,需要的朋友参考一下 KVC(Key-Value-Coding)内部的实现:一个对象在调用setValue的时候,(1)首先根据方法名找到运行方法的时候所需要的环境参数。(2)他会从自己isa指针结合环境参数,找到具体的方法实现的接口。(3)再直接查找得来的具体的方法实现。KVO(Key-Va