Android-Canvas.save() Canvas.restore() 总结

相信很多人和我一样看了官方文档对Canvas save(), restore()方法的解释还是一个头雾水,save()保存的到底是什么信息呢?

答案是:坐标系的原点,坐标轴方向的信息。

我们在使用Canvas时难免会用到transitoin(), rotate()方法来改变坐标系的原点和坐标轴的方向,save()保存的正是这些信息。

下面举个栗子:

该例子用Canvas绘制一个仪表盘。自定义View,在onDraw()方法中绘制该仪表盘。

 1 /**
 2  * Created by Administrator on 2015/2/1 0001.
 3  */
 4 public class ImageMatrixView extends View {
 5
 6
 7     public ImageMatrixView(Context context) {
 8         super(context);
 9
10     }
11
12     public ImageMatrixView(Context context, AttributeSet attrs) {
13         super(context, attrs);
14
15     }
16
17
19     @TargetApi(Build.VERSION_CODES.LOLLIPOP)
20     @Override
21     protected void onDraw(Canvas canvas) {
22         super.onDraw(canvas);
23        //画笔用于绘制圆和刻度
24             Paint paintLine = new Paint();
25             paintLine.setColor(Color.BLUE);
26             paintLine.setStyle(Paint.Style.STROKE);
27             paintLine.setTextSize(20);
28         //画笔用于绘制指针
29             Paint paintPointer = new Paint();
30             paintPointer.setStrokeWidth(10);
31       //获取圆的半径
32         float radius = Math.min(getWidth() / 2, getHeight() / 2);
33
34         //画圆周
35         canvas.drawCircle(radius, radius, radius, paintLine);
36         //变化坐标系,改变后,坐标原点在(radius, radius),x轴正方形水平向右,y轴正方向水平向下
37         canvas.translate(radius, radius);
38
39         //保存坐标系信息
40         canvas.save();
41
42         //画圆上的点
43         for (int i = 0; i < 12; i++)
44         {
45             if (i % 3 == 0)
46             {
47                 canvas.drawLine(0, -radius, 0,  - (radius - 20), paintLine);
48             }
49             else
50             {
51                 canvas.drawLine(0, -radius, 0, -(radius - 10), paintLine);
52             }
53             canvas.drawText(String.valueOf(i), 0, - (radius - 24), paintLine);
54             //将坐标系顺时针旋转30度,
55             canvas.rotate(30, 0, 0);
56         }
57
58         //回到上次保存的状态:坐标原点在(radius, radius),x轴正方向水平向右,y轴正方向水平向下
59         canvas.restore();       //在保存的状态上继续改变坐标轴
60         canvas.rotate(30);       //绘制指针
61         canvas.drawLine(0, 0, 40, 0, paintPointer);
62         canvas.rotate(30);
63         canvas.drawLine(0, 0, 60, 0, paintLine);
67     }
68 }

效果图:

时间: 2024-08-08 05:58:18

Android-Canvas.save() Canvas.restore() 总结的相关文章

canvas.save() canvas.restore() 作用

这里canvas.save();和canvas.restore();是两个相互匹配出现的,作用是用来保存画布的状态和取出保存的状态的.这里稍微解释一下, 当我们对画布进行旋转,缩放,平移等操作的时候其实我们是想对特定的元素进行操作,比如图片,一个矩形等,但是当你用canvas的方法来进行这些操作的时候,其实是对整个画布进行了操作,那么之后在画布上的元素都会受到影响,所以我们在操作之前调用canvas.save()来保存画布当前的状态,当操作之后取出之前保存过的状态,这样就不会对其他的元素进行影响

HTML5 canvas save和restore方法讲解

源:http://www.silverlightchina.net/html/HTML_5/study/2012/0326/14828.html save()和restore()方法是绘制复杂图形必不可少的方法.它们分别是用来 保存和恢复 canvas 状态的,都没有参数. Canvas 状态是以堆(stack)的方式保存的,每一次调用 save 方法,当前的状态就会被推入堆中保存起来.这种状态包括:当前应用的变形(即移动,旋转和缩放,见下): strokeStyle, fillStyle, g

[ html canvas save restore ] canvas绘图 save restore 属性理论讲解

Canvas API详解(Part 1) 分类 Android 基础入门教程 本节引言: 前面我们花了13小节详细地讲解了Android中Paint类大部分常用的API,本节开始我们来讲解 Canvas(画板)的一些常用API,我们在 8.3.1 三个绘图工具类详解 中已经列出了我们可供调用的一些方法,我们分下类: drawXxx方法族:以一定的坐标值在当前画图区域画图,另外图层会叠加, 即后面绘画的图层会覆盖前面绘画的图层. clipXXX方法族:在当前的画图区域裁剪(clip)出一个新的画图

android_浅析canvas的save()和restore()方法

[java] view plain copy <span style="font-size:18px;"> </span> [java] view plain copy <span style="font-size:18px;"></span> 绘图之前,首先需要调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上!Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进

Canvas的save和restore

在创建新的控件或修改现有的控件时,我们都会涉及到重写控件或View的onDraw方法. onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布. 在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的呢? ? save:用来保存Canvas的状态.save之后,可以调用Canvas的平移.放缩.旋转.错切.裁剪等操作. ? restore:用来恢复Canvas之前保存的状态.防止save后对Canvas执行的操作对后续的绘制有影响. sa

canvas 中save和restore的用法

在创建新的控件或修改现有的控件时,我们都会涉及到重写控件或View的onDraw方法. onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布. 在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的呢? ? save:用来保存Canvas的状态.save之后,可以调用Canvas的平移.放缩.旋转.错切.裁剪等操作. ? restore:用来恢复Canvas之前保存的状态.防止save后对Canvas执行的操作对后续的绘制有影响. sa

canvas.save()和canvas.restore()作用

文章转自:oney139: 最终所有权归作者所有. 链接:http://blog.csdn.net/oney139/article/details/8143281. canvas.save()和canvas.restore():是两个相互匹配出现的,作用是用来存储画布的状态和取出保存的状态的.这里稍微解释一下. 当我们对画布进行旋转,缩放,平移等操作的时候其实是对特定的元素进行操作,比如图片,一个矩形等.但是当你用canvas的方法来进行这些操作的时候,其实是对整个画布进行了操作,那么之后在画布

Android Bitmap和Canvas学习笔记

位图是我们开发中最常用的资源,毕竟一个漂亮的界面对用户是最有吸引力的. 1. 从资源中获取位图 可以使用BitmapDrawable或者BitmapFactory来获取资源中的位图. 当然,首先需要获取资源: Resources res=getResources(); 使用BitmapDrawable获取位图 使用BitmapDrawable (InputStream is)构造一个BitmapDrawable: 使用BitmapDrawable类的getBitmap()获取得到位图: // 读

Android:使用canvas绘柱状统计图(自动计算宽高及分度值、可左右滑动)

本例实现了一个简单的柱状统计图,如下:        特点: 1.根据数据源自动计算每个条目的高度.宽度.间距,自动计算分度值. 2.当条目数较多时,可左右滑动查看全部内容,图形.文字同步滑动,并且松手后会渐渐的停下来(而不是立刻停下来). 代码: (1)核心代码:BarChartView.java package com.sina.appbarchart; import android.app.Activity; import android.content.Context; import a

Android Canvas save() restore()

Android Canvas save() restore()