Android 中Canvas的save(),saveLayer()和restore()解析
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()解析相关推荐
- Android中Canvas绘图之Shader使用图文详解
概述 我们在用Android中的Canvas绘制各种图形时,可以通过Paint.setShader(shader)方法为画笔Paint设置shader,这样就可以绘制出多彩的图形.那么Shader是什 ...
- android中matrix的单位,Android中canvas和matrix之间的关系是什么?
我读了这个画布概述: The Canvas class holds the "draw" calls. To draw something, you need 4 basic co ...
- Android中Canvas绘图基础详解(附源码下载)
看到了一篇比较详细的Canvas文章,转过来方便自己查看. 源地址:http://blog.csdn.net/iispring/article/details/49770651 Android中,如果 ...
- android 自定义paint,Android中自定义常用的三个对象解析(Paint,Color,Canvas)
Paint,Color,Canvas Paint:画笔对象,画图用的"笔" Color:颜色,相当于调料 Canvas:画布,现实中的纸板 Paint 画笔 常用的方法就是设置和获 ...
- android中Canvas使用drawBitmap绘制图片
1.主要的绘制图片方法 //Bitmap:图片对象,left:偏移左边的位置,top: 偏移顶部的位置 drawBitmap(Bitmap bitmap, float left, float ...
- Android中Canvas和Paint的常用方法
Canvas: void drawRect(RectF rect, Paint paint) //绘制区域,参数一为RectF一个区域 void drawPath(Path path, Paint p ...
- Android中canvas学习笔记
第三届互联网大会结束时间不长,却给我的触动很大,看到了很多的AI(人工智能),或许将来的某一天很多职业会被AI替代,包括80%的程序员,我们做为社会中的一份子,只有不断的提升自己,居安思危,才不会被这 ...
- android drawtext参数,Android中canvas中drawText详解
开篇 安卓写自定义View中有一个类相信大家不会陌生,那就是Canvas.Canvas给我们调用者提供的api也很丰富.我们经常用到的画圆(drawCircle),画线(drawLine).今天我们的 ...
- 关于 Android 中 TabLayout 下划线适配文字长度解析(附清晰详细的源码解析)
温故而知新 坚持原创 请多多支持 一.问题背景 假期在做项目的时候,当时遇到了一个需求就是需要使用 TabLayout + ViewPager 来实现一个上部导航栏的动态效果,并且希望下划线的长度等于 ...
最新文章
- php mysqli扩展之预处理
- JavaScript 的简单学习2
- ElementUI中Transfer穿梭框的使用、赋值取值进而实现新增和编辑功能
- 三大电机控制方案之DSP篇(1):TMS320F28335
- Dojo 如何测试 widget 1
- 初识delphi-spring-framework
- android屏幕适配无效_AndroidAutoLayout
- WinRAR的注册破解
- SCI论文写作高频词汇短语汇总
- python全栈学习--day45(前端HTML)
- PL/SQL破解方法(不需要注册码)
- qcloud apigateway hmac鉴权代码-go语言版本
- Spring-拦截器与过滤器
- 由人眼追踪技术想到的
- GrayLog 设置日志保留时间每天1个索引,保留183天(6个月)
- 正则表达式在线生成器(txt2re)
- A Vertical Kelvin Test Structure for Measuring the True Specific Contact Resistivity
- PSM倾向得分匹配代码和案例数据
- CAD2020版本设置为经典模式
- 浅谈垂直搜索引擎技术