http://www.cnblogs.com/xirihanlin/archive/2009/07/24/1530246.html
在创建新的控件或修改现有的控件时,我们都会涉及到重写控件或View的onDraw方法。
onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布。
在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的呢?
❑ save:用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。
❑ restore:用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。
save和restore要配对使用(restore可以比save少,但不能多),如果restore调用次数比save多,会引发Error。
例如:我们先想在画布上绘制一个右向的三角箭头,当然,我们可以直接绘制,另外,我们也可以先把画布旋转90°,画一个向上的箭头,然后再旋转回来(这种旋转操作对于画圆周上的标记非常有用)。然后,我们想在右下角有个20像素的圆,那么,onDraw中的核心代码是:
int px = getMeasuredWidth();
int py = getMeasuredWidth();
// Draw background
canvas.drawRect(0, 0, px, py, backgroundPaint);
canvas.save();
canvas.rotate(90, px/2, py/2);
// Draw up arrow
canvas.drawLine(px / 2, 0, 0, py / 2, linePaint);
canvas.drawLine(px / 2, 0, px, py / 2, linePaint);
canvas.drawLine(px / 2, 0, px / 2, py, linePaint);
canvas.restore();
// Draw circle
canvas.drawCircle(px - 10, py - 10, 10, linePaint);
效果如图1所示:
图1
如果我们不调用save和restore会是什么样子呢?如图2所示:
图2
从这两个图中,我们就能看到圆圈位置的明显差异。不进行Canvas的save和restore操作的话,所有的图像都是在画布旋转90°后的画布上绘制的。当执行完onDraw方法,系统自动将画布恢复回来。save和restore操作执行的时机不同,就能造成绘制的图形不同。
所以,save和restore之间,往往夹杂的是对Canvas的特殊操作。
相关推荐
`save()`和`restore()`是`Canvas`中两个非常关键的方法,它们主要用于管理绘图状态,确保复杂绘图过程中的可逆性和精确性。在本文中,我们将深入理解这两个方法的作用以及如何在实际应用中使用它们。 首先,`canvas...
`save()`和`restore()`是`Canvas`类中两个非常重要的方法,它们用于管理和恢复绘图状态,确保复杂的绘图操作能够正确无误地进行。在本文中,我们将深入探讨这两个方法的用法、原理以及它们在实际开发中的应用。 `...
`save()`和`restore()`是Canvas中的两个关键方法,它们在复杂的绘图场景中起到至关重要的作用。本演示将深入探讨这两个方法以及它们在Android图形绘制中的应用。 `Canvas.save()`方法的主要功能是保存当前Canvas的...
`save()`和`restore()`是Canvas的重要方法,用于保存和恢复绘图状态,这对于实现复杂的图形变换、绘制流程控制以及避免不必要的计算至关重要。下面将详细阐述这两个方法的用法和应用场景。 1. `save()`方法: `save...
一:canvas中的save和restore 一直以来没有特别明白canvas中的save()和restore()函数,这次终于通过微信小程序中使用此函数的时候弄明白了,以下代码可以运行在微信小程序中~~ 看效果: (此图片来源于网络,如有...
为提高性能,可以使用`ctx.save()`和`ctx.restore()`方法保存和恢复当前绘图状态,或者使用局部重绘,只对移动的矩形区域进行更新。 6. **动画效果**:如果希望矩形平滑移动,可以使用定时器和缓动函数来实现。在`...
本示例重点探讨的是如何使用Canvas进行图形的平移和缩放操作,这对于创建动态效果或者自定义视图(View)尤其重要。 一、Canvas与Bitmap 在Android中,Canvas是用来在指定的Bitmap上进行绘图的。Bitmap是实际存储...
在绘制过程中,我们可以使用save()和restore()方法来保存和恢复Canvas的状态。这对于进行多次绘制并且需要保持某些属性不变(如坐标变换或剪裁区域)的情况下非常有用。例如,在绘制机器人的不同部分时,可能会涉及...
另外,为了提高性能,可以考虑使用剪裁区域(`clip` 方法)或者保存/恢复状态(`save` 和 `restore` 方法)来避免不必要的重绘。如果视图树非常大,还可以采用分层渲染策略,只绘制可见部分或使用虚拟DOM技术优化。 ...
Canvas提供了丰富的API,允许开发者进行复杂的自定义视图(Custom View)绘制,包括放大、缩小和平移等操作。这些功能使得用户界面更加动态和交互性更强。接下来,我们将深入探讨如何在Android中使用Canvas实现这些...
5. **save()** 和 **restore()**:保存和恢复Canvas的状态,用于进行复杂的图形变换,如旋转、缩放、平移等。 6. **translate()**、**scale()** 和 **rotate()**:这些方法用于改变Canvas的坐标系统,从而影响后续...
在实际应用中,可能还会涉及到性能优化,例如通过保存和恢复状态(`save()` 和 `restore()`)来避免不必要的重绘,或者使用Web Workers来异步处理图像数据,以减少主线程的负担。 总的来说,“Canvas2D梯形拉伸”是...
默认情况下,Canvas的坐标原点位于视图左上角,但可以通过`save()`和`restore()`方法保存和恢复状态,改变旋转的基点。 ```java canvas.save(); canvas.rotate(angle, pivotX, pivotY); // 在此之后的绘制都会受到...
`restore`方法用于撤销最近一次调用`save`方法后的所有状态改变,包括`translate`和`rotate`,使得画布恢复到初始状态,以便下一次绘图。 通过以上步骤,我们可以成功地在Canvas上实现图片在原位置的旋转。这个例子...
在网页开发中,Canvas是HTML5提供的一种强大的图形绘制接口,可以用来实现各种动态图形和交互效果。"canvas实现涂鸦效果"这个主题涉及到的是如何利用Canvas API来创建一个具有涂鸦功能的画板应用。下面将详细讲解...
在这个示例中,我们将深入探讨如何利用canvas进行图片的裁剪、旋转和缩放操作。 首先,我们需要在HTML文件中创建一个canvas元素,并通过JavaScript获取到这个元素的2D渲染上下文。在HTML部分,可以这样设置: ```...
- 使用`canvas.save()`保存当前Canvas的状态,防止坐标系变化影响其他元素。 - 通过`canvas.translate(0, -textHeight)`将坐标原点向上移动一个文本高度的距离,确保下一行文本在上一行的下方。 - 使用`paint....
另外,`save()`和`restore()`方法用于保存和恢复绘图状态,这对于创建复杂的图形动画或者复用相同的绘图设置非常有用。 在实际应用中,Canvas常用于创建交互式图表、游戏场景、动态图像效果等。开发者可以通过监听...
这个例子展示了如何使用Canvas的基本绘图操作,如绘制线条和旋转坐标系,以及如何利用Android的View机制来实现动态效果。理解并熟练掌握这些概念对于任何Android开发者来说都是非常重要的,尤其是在创建自定义UI组件...
Canvas是HTML5中的一个强大的图形绘制工具,它允许开发者通过JavaScript动态生成和操控2D和3D图形。 首先,让我们理解基本概念。HTML5 Canvas是一个基于矢量图形的画布元素,它通过JavaScript提供了一套绘图API,...