Android canvas.save()与canvas.restore()的使用总结

2024-04-03 20:48

本文主要是介绍Android canvas.save()与canvas.restore()的使用总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

含义
canvas.save();

画布将当前的状态保存

canvas.restore();

画布取出原来所保存的状态

使用

canvas.save();与canvas.restore();一般结合使用,.save()函数在前,.restore()函数在后,用来保证在这两个函数之间所做的操作不会对原来在canvas上所画图形产生影响。比如下面这张图:
在这里插入图片描述
蓝色方块里面有三张图,两张正常画,一张倾斜45度角画
首先,你可以这样画:先画左上角和左下角的两个图,然后将画布倾斜45度角,再去画第三张图,这样是没问题的,代码如下:

@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//第一张canvas.drawBitmap(bitmap, 0 , 0 , paint);//第二张canvas.drawBitmap(bitmap, 0 , getHeight()- bitmap.getHeight() , paint);//旋转45canvas.rotate(45 , getWidth()/2 , getHeight()/2);//第三张canvas.drawBitmap(bitmap, getWidth()/2- bitmap.getWidth()/2 , getHeight()/2- bitmap.getHeight()/2 , paint);}

如果你要是按这样的顺序画:第一张–>倾斜45度的那一张–>第三张

@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//第一张canvas.drawBitmap(bitmap, 0 , 0 , paint);//旋转45canvas.rotate(45 , getWidth()/2 , getHeight()/2);//第二张canvas.drawBitmap(bitmap, getWidth()/2- bitmap.getWidth()/2 , getHeight()/2- bitmap.getHeight()/2 , paint);//第三张canvas.drawBitmap(bitmap, 0 , getHeight()- bitmap.getHeight() , paint);}

那么结果就变成了这样:
在这里插入图片描述
wtf!第三张图为什么出去了,而且它也没有老实的呆在左下角!
我们来看上面的代码:
第一行:画第一张左上角的图
第二行:旋转画布45度
第三行:画第二张倾斜的图
第四行:画第三张左下角的图
看起来是没有什么问题,但是第二行代码将canvas旋转了45度,所以以后再往canvas上画图的时候都是在这个旋转45度的基础上进行的,也就是说整个坐标系旋转了45度,它已经不再是原来水平竖直的坐标系了,所以第三次画的图会出现偏移。那么如何解决?如下:

@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//第一张canvas.drawBitmap(bitmap, 0 , 0 , paint);//保存画布状态canvas.save();//旋转45canvas.rotate(45 , getWidth()/2 , getHeight()/2);//第二张canvas.drawBitmap(bitmap, getWidth()/2- bitmap.getWidth()/2 , getHeight()/2- bitmap.getHeight()/2 , paint);//取出原来保存的状态canvas.restore();//第三张canvas.drawBitmap(bitmap, 0 , getHeight()- bitmap.getHeight() , paint);}

在你画完第一张图以后,当要开始画倾斜的那一张的时候,因为你要对画布进行角度的旋转,并且你只想让当前的这一张产生倾斜的角度,所以应该在将画布进行旋转之前将原来的状态进行保存,在画完倾斜的图片后将原来的状态取出来再进行后续的操作,那么你刚才旋转画布的操作就不会对你后续产生影响。

这篇关于Android canvas.save()与canvas.restore()的使用总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/873940

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

关于C++中的虚拟继承的一些总结(虚拟继承,覆盖,派生,隐藏)

1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下: class A class B1:public virtual A; class B2:pu

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

Lipowerline5.0 雷达电力应用软件下载使用

1.配网数据处理分析 针对配网线路点云数据,优化了分类算法,支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类;一键生成危险点报告和交跨报告;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:2895356150@qq.com,资源源于网络,本介绍用于学习使用,如有侵权请您联系删除! 2.新增快速版,简洁易上手 支持快速版和专业版切换使用,快速版界面简洁,保留主

如何免费的去使用connectedpapers?

免费使用connectedpapers 1. 打开谷歌浏览器2. 按住ctrl+shift+N,进入无痕模式3. 不需要登录(也就是访客模式)4. 两次用完,关闭无痕模式(继续重复步骤 2 - 4) 1. 打开谷歌浏览器 2. 按住ctrl+shift+N,进入无痕模式 输入网址:https://www.connectedpapers.com/ 3. 不需要登录(也就是

十五.各设计模式总结与对比

1.各设计模式总结与对比 1.1.课程目标 1、 简要分析GoF 23种设计模式和设计原则,做整体认知。 2、 剖析Spirng的编程思想,启发思维,为之后深入学习Spring做铺垫。 3、 了解各设计模式之间的关联,解决设计模式混淆的问题。 1.2.内容定位 1、 掌握设计模式的"道" ,而不只是"术" 2、 道可道非常道,滴水石穿非一日之功,做好长期修炼的准备。 3、 不要为了

Eclipse+ADT与Android Studio开发的区别

下文的EA指Eclipse+ADT,AS就是指Android Studio。 就编写界面布局来说AS可以边开发边预览(所见即所得,以及多个屏幕预览),这个优势比较大。AS运行时占的内存比EA的要小。AS创建项目时要创建gradle项目框架,so,创建项目时AS比较慢。android studio基于gradle构建项目,你无法同时集中管理和维护多个项目的源码,而eclipse ADT可以同时打开

android 免费短信验证功能

没有太复杂的使用的话,功能实现比较简单粗暴。 在www.mob.com网站中可以申请使用免费短信验证功能。 步骤: 1.注册登录。 2.选择“短信验证码SDK” 3.下载对应的sdk包,我这是选studio的。 4.从头像那进入后台并创建短信验证应用,获取到key跟secret 5.根据技术文档操作(initSDK方法写在setContentView上面) 6.关键:在有用到的Mo

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现