1、save()方法 :
用来保存Canvas的状态,save()方法之后的代码,可以调用Canvas的平移、放缩、旋转、裁剪等操作!
2、restore()方法:
用来恢复Canvas之前保存的状态(可以想成是保存坐标轴的状态),防止save()方法代码之后对Canvas执行的操作,继续对后续的绘制会产生影响,通过该方法可以避免连带的影响

总结:就是在save之前绘制的状态会保存下来,在restore方法之后绘制的不会再因为状态而改变

示例说明:
例如:我们想在画布上绘制一个向右的三角箭头,当然,我们可以直接绘制,另外,我们也可以先把画布旋转90°,画一个向上的箭头,然后再旋转回来(这种旋转操作对于画圆周上的标记非常有用),最后,我们在右下角绘一个20像素的圆!

———————————————————————
有需求者请加qq:136137465,非诚勿扰
(java 架构师全套教程,共760G, 让你从零到架构师,每月轻松拿3万)
01.高级架构师四十二个阶段高
02.Java高级系统培训架构课程148课时
03.Java高级互联网架构师课程
04.Java互联网架构Netty、Nio、Mina等-视频教程
05.Java高级架构设计2016整理-视频教程
06.架构师基础、高级片
07.Java架构师必修linux运维系列课程
08.Java高级系统培训架构课程116课时
(送:hadoop系列教程,java设计模式与数据结构, Spring Cloud微服务, SpringBoot入门)
——————————————————————–

网上对这个问题的解决说是旋转回来,我的感觉其实save()保存的就是Canvas中坐标轴的状态。

/*** 测试canvas.save与canvas.restore方法* @Project    App_View* @Package    com.android.view.canavssave* @author     chenlin* @version    1.0* @Date       2014年5月7日*/
public class CanvasView extends View {public final static String TAG = "CanvasView";private int mWidth = 300;private int mHeight = 300;public CanvasView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}public CanvasView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public CanvasView(Context context) {this(context, null);}@Overrideprotected void onDraw(Canvas canvas) {// 绘制背景画笔Paint backPaint = new Paint();backPaint.setColor(Color.GRAY);// 绘制线条画笔Paint linePaint = new Paint();linePaint.setStrokeWidth(4);linePaint.setColor(Color.RED);// 绘制背景canvas.drawRect(0, 0, mWidth, mHeight, backPaint);canvas.save();//旋转画布canvas.rotate(90, mWidth / 2, mHeight / 2);//绘制三条线条canvas.drawLine(mWidth / 2, 0, 0, mHeight / 2, linePaint);canvas.drawLine(mWidth / 2, 0, mWidth, mHeight / 2, linePaint);canvas.drawLine(mWidth / 2, 0, mWidth / 2, mHeight, linePaint);canvas.restore();//在恢复后绘制圆形 ,保持原状,没有旋转canvas.drawCircle(mWidth - 100, mHeight - 100, 50, linePaint);super.onDraw(canvas);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {//mWidth = w;//mHeight = h;super.onSizeChanged(w, h, oldw, oldh);}}

1)canvas.save后的图片

2)没有save的图片

3.saveLayer的用法
Canvas 在一般的情况下可以看作是一张画布,所有的绘图操作如drawBitmap, drawCircle都发生在这张画布上,这张画板还定义了一些属性比如Matrix,颜色等等。但是如果需要实现一些相对复杂的绘图操作,比如多层动 画,地图(地图可以有多个地图层叠加而成,比如:政区层,道路层,兴趣点层)。Canvas提供了图层(Layer)支持,缺省情况可以看作是只有一个图 层Layer。如果需要按层次来绘图,Android的Canvas可以使用SaveLayerXXX, Restore 来创建一些中间层,对于这些Layer是按照“栈结构“来管理的:

示例代码:

public class LayerView extends View {private static final int RADIUS = 75;private static final int LAYER_FLAGS = Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG| Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG;private Paint mPaint;public LayerView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}public LayerView(Context context, AttributeSet attrs) {super(context, attrs);mPaint = new Paint();mPaint.setAntiAlias(true);}public LayerView(Context context) {super(context);mPaint = new Paint();mPaint.setAntiAlias(true);}@Overrideprotected void onDraw(Canvas canvas) {canvas.drawColor(Color.WHITE);canvas.translate(10, 10);// 绘制第一个圆圈,在layer1上mPaint.setColor(Color.RED);canvas.drawCircle(RADIUS, RADIUS, RADIUS, mPaint);// 设置第二个图层的透明度canvas.saveLayerAlpha(0, 0, 300, 300, 0x88, LAYER_FLAGS);// 绘制第二圆圈,在layer2上mPaint.setColor(Color.BLUE);canvas.drawCircle(RADIUS + 75, RADIUS + 75, RADIUS, mPaint);// 设置第三个图层的透明度canvas.saveLayerAlpha(100, 100, 400, 400, 0x88, LAYER_FLAGS);// 绘制第三圆圈,在layer3上mPaint.setColor(Color.GREEN);canvas.drawCircle(RADIUS + 120, RADIUS + 120, RADIUS, mPaint);canvas.restore();}}

结果如图:

Android 中Canvas的save(),saveLayer()和restore()解析相关推荐

  1. Android中Canvas绘图之Shader使用图文详解

    概述 我们在用Android中的Canvas绘制各种图形时,可以通过Paint.setShader(shader)方法为画笔Paint设置shader,这样就可以绘制出多彩的图形.那么Shader是什 ...

  2. android中matrix的单位,Android中canvas和matrix之间的关系是什么?

    我读了这个画布概述: The Canvas class holds the "draw" calls. To draw something, you need 4 basic co ...

  3. Android中Canvas绘图基础详解(附源码下载)

    看到了一篇比较详细的Canvas文章,转过来方便自己查看. 源地址:http://blog.csdn.net/iispring/article/details/49770651 Android中,如果 ...

  4. android 自定义paint,Android中自定义常用的三个对象解析(Paint,Color,Canvas)

    Paint,Color,Canvas Paint:画笔对象,画图用的"笔" Color:颜色,相当于调料 Canvas:画布,现实中的纸板 Paint 画笔 常用的方法就是设置和获 ...

  5. android中Canvas使用drawBitmap绘制图片

    1.主要的绘制图片方法 //Bitmap:图片对象,left:偏移左边的位置,top: 偏移顶部的位置     drawBitmap(Bitmap bitmap, float left, float ...

  6. Android中Canvas和Paint的常用方法

    Canvas: void drawRect(RectF rect, Paint paint) //绘制区域,参数一为RectF一个区域 void drawPath(Path path, Paint p ...

  7. Android中canvas学习笔记

    第三届互联网大会结束时间不长,却给我的触动很大,看到了很多的AI(人工智能),或许将来的某一天很多职业会被AI替代,包括80%的程序员,我们做为社会中的一份子,只有不断的提升自己,居安思危,才不会被这 ...

  8. android drawtext参数,Android中canvas中drawText详解

    开篇 安卓写自定义View中有一个类相信大家不会陌生,那就是Canvas.Canvas给我们调用者提供的api也很丰富.我们经常用到的画圆(drawCircle),画线(drawLine).今天我们的 ...

  9. 关于 Android 中 TabLayout 下划线适配文字长度解析(附清晰详细的源码解析)

    温故而知新 坚持原创 请多多支持 一.问题背景 假期在做项目的时候,当时遇到了一个需求就是需要使用 TabLayout + ViewPager 来实现一个上部导航栏的动态效果,并且希望下划线的长度等于 ...

最新文章

  1. php mysqli扩展之预处理
  2. JavaScript 的简单学习2
  3. ElementUI中Transfer穿梭框的使用、赋值取值进而实现新增和编辑功能
  4. 三大电机控制方案之DSP篇(1):TMS320F28335
  5. Dojo 如何测试 widget 1
  6. 初识delphi-spring-framework
  7. android屏幕适配无效_AndroidAutoLayout
  8. WinRAR的注册破解
  9. SCI论文写作高频词汇短语汇总
  10. python全栈学习--day45(前端HTML)
  11. PL/SQL破解方法(不需要注册码)
  12. qcloud apigateway hmac鉴权代码-go语言版本
  13. Spring-拦截器与过滤器
  14. 由人眼追踪技术想到的
  15. GrayLog 设置日志保留时间每天1个索引,保留183天(6个月)
  16. 正则表达式在线生成器(txt2re)
  17. A Vertical Kelvin Test Structure for Measuring the True Specific Contact Resistivity
  18. PSM倾向得分匹配代码和案例数据
  19. CAD2020版本设置为经典模式
  20. 浅谈垂直搜索引擎技术

热门文章

  1. UE4使用Matinee做开关门动画
  2. JSF,为什么把简单的事情复杂化?
  3. 系统编程概述(进程)
  4. 自然人代开需要准备什么?需要缴纳什么税?
  5. Blender——苹果的材质绘制
  6. JVM GC FINALIZE
  7. 为了 GitHub 问题票,开发者做了一套小票打印机解决方案
  8. 扩展的应用范围 ios_使用插件扩展iOS应用
  9. Postman测试百度AI翻译接口、接口测试
  10. android手机上图像分类技术的研究,用图片分类技术实现“拍照识花”的原理详解...