Canvas的效果操作及save()和restore()方法应用
平移、缩放、旋转等操作等于是,我在一个正的画布绘制好图,然后再把画布做旋转、平移、缩放等等的效果。
也就是说,我使用的X、Y坐标还是正常的坐标(没旋转、平移、缩放等之前的坐标)。
save()和restore()是用来规定操作的范围的。
如果有save()和restore(),那么平移、缩放、旋转等操作只对save()和restore()作用域之间的代码有效。
在此我参考了http://www.javaeye.com/topic/440623
然后我做了代码测试(在onDraw()中画图),如下:
protected void onDraw(Canvas canvas){
//首先定义中心点和半径
int px=getMeasuredWidth()/2;
int py=getMeasuredHeight()/2;
int radius=Math.min(px, py);
canvas.drawCircle(px, py, radius, circlePaint);
canvas.save();//注释save①
canvas.rotate(-bearing, px, py);
//canvas.save();
int textWidth=(int)textPaint.measureText("W");
int cardinalX=px-textWidth/2;
int cardinalY=py-radius+textHeight;
//开始绘制刻度和文字
//每15度一个刻度,每45度一个数字,每90度一个方向
for(int i=0; i<24; i++){
canvas.drawLine(px, py-radius, px, py-radius+10, markerPaint);
canvas.save();//注释save②
canvas.translate(0, textHeight);
if(i%6==0){
String dirString="";
switch(i){
case(0):{
dirString=northString;
int arrowY=2*textHeight;
canvas.drawLine(px, arrowY, px-5, 3*textHeight, markerPaint);
canvas.drawLine(px, arrowY, px+5, 3*textHeight, markerPaint);
break;
}
case(6):dirString=eastString;break;
case(12):dirString=westString;break;
case(18):dirString=southString;break;
}
canvas.drawText(dirString, cardinalX, cardinalY, textPaint);
}
else if(i%3==0){
String angle=String.valueOf(i*15);
float angleTextWidth=textPaint.measureText(angle);
int angleX=(int)(px-angleTextWidth/2);
int angleY=py-radius+textHeight;
canvas.drawText(angle, angleX, angleY, textPaint);
}
canvas.restore();//注释restore②
canvas.rotate(15, px, py);
}
//测试save()和restore()的作用域
canvas.drawText("Hello world 在restore之前!", 100, 100, textPaint);
canvas.restore();//注释restore①
canvas.drawText("Hello world 在restore之后!", 100, 100, textPaint);
}
//结论:在save②到restore②之间所画的图顶点下移textHeight个像素,restore②之后的代码不受影响
//在save①到restore①之间所画的内容都选择45°,restore①之后的代码不会旋转
//注意save②到restore②也是在save①到restore①作用之内的,所以save②到restore②之间的内容不但顶点下移textHeight个像素,并且旋转
//45度。

Canvas的效果操作及save()和restore()方法应用的更多相关文章
- canvas中save()和restore()方法
save()和restore()方法是绘制复杂图形不可缺少的方法它们是分别用来保存和恢复canvas状态的,都没有参数 save():用来保存Canvas的状态.save之后,可以调用Canvas的平 ...
- HTML5中canvas的save和restore方法
canvas的save和restore方法: save() 方法把当前绘画状态的一份拷贝压入到一个保存图像状态的栈中.这里的绘画状态指坐标原点.变形时的变化矩阵(该矩阵是调用 rotate().sca ...
- android_浅析canvas的save()和restore()方法
<span style="font-size:18px;"> </span> <span style="font-size:18px;&qu ...
- canvas的save与restore方法的作用
网上搜罗了一堆资料,最后总结一下. save:用来保存Canvas的状态.save之后,可以调用Canvas的平移.放缩.旋转.错切.裁剪等操作. restore:用来恢复Canvas之前保存的状态. ...
- HTML5 canvas save()和restore()方法讲解
我们尝试用这个连续矩形的例子来描述 canvas 的状态堆是如何工作的.第一步是用默认设置画一个大四方形,然后保存一下状态.改变填充颜色画第二个小一点的白色四方形,然后再保存一下状态.再次改变填充颜色 ...
- canvas 中save和restore的用法
在创建新的控件或修改现有的控件时,我们都会涉及到重写控件或View的onDraw方法. onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布. 在onDraw方法里,我们经常会 ...
- [js高手之路] html5 canvas系列教程 - 状态详解(save与restore)
本文内容与路径([js高手之路] html5 canvas系列教程 - 开始路径beginPath与关闭路径closePath详解)是canvas中比较重要的概念.掌握理解他们是做出复杂canvas动 ...
- canvas 图片拖拽旋转之二——canvas状态保存(save和restore)
引言 在上一篇日志“canvas 图片拖拽旋转之一”中,对坐标转换有了比较深入的了解,但是仅仅利用坐标转换实现的拖拽旋转,会改变canvas坐标系的状态,从而影响画布上其他元素的绘制.因此,这个时候需 ...
- Canvas的save和restore
在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的呢? int px = getMeasuredWidth(); int py = getMeasuredWid ...
随机推荐
- JAVA 基础--开发环境Sublime Text 3 搭建
方法一 打开Sublime Text 3,依次点击Preference, Browse Packages,在打开的窗口中双击User文件夹,新建文件JavaC.sublime-build,用记事本打 ...
- 一个程序员一月的开销统计分析、(附上PC端和移动端android源码)
图片1(类别): 图片中的数据是我一月的花费统计分析. 这是该网站的地址:http://www.10086bank.com/(需要登录) 没有帐号马上注册一个吧.进入系统后点击“记一笔” 添加数据 ...
- Leetcode 482.密钥格式化
密钥格式化 给定一个密钥字符串S,只包含字母,数字以及 '-'(破折号).N 个 '-' 将字符串分成了 N+1 组.给定一个数字 K,重新格式化字符串,除了第一个分组以外,每个分组要包含 K 个字符 ...
- Wannafly挑战赛3
B遇见 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 65536K,其他语言131072K64bit IO Format: %lld 题目描述 A和B在同一条路上,他们之间的距离为 k ...
- 用CSV库一行行插入数据
语料团队之前都是手动标注文字的定位位置,今天写了个小脚本,帮他们批量生成文字对应的定位. 其中数据生成后,要生成csv文件,查看了下使用csv库. import csv row1 = [1,2,3,4 ...
- [error:没有解析库]Couldn't find a tree builder with the features you requested: xml. Do you need to install a parser library?
将代码拷贝到服务器上运行,发生错误提示需要新安装parser library. 查看代码中发现有以下内容: soup = BeautifulSoup(open(fp), 'xml') 安装解析库即可: ...
- 下载,配置环境变量,第一个demo
一.在 http://www.oracle.com 下载java JDK 安装到自定义的地方. 二.配置环境变量:在我的电脑→高级系统设置→环境变量 ① 找到Path新增一个路径(该路径为JDK存放的 ...
- 【Luogu】P3709大爷的字符串题(莫队算法)
题目链接 语文题啊…… 看题解发现是让求区间中最多的数的个数,于是果断理解了一会题解……莫队套上完事. sum[i]表示i这个数出现的次数,cnt[i]表示出现i次的数有几个,然后乱搞搞……就好了 # ...
- 【bzoj1257】[CQOI2007]余数之和sum
[bzoj1257][CQOI2007]余数之和sum 2014年9月1日1,9161 Description 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod ...
- google jib容器打包工具
简介 Jib 是 Google 开发的可以直接构建 Java 应用的 Docker 和 OCI 镜像的类库,以 Maven 和 Gradle 插件形式提供. 通过 Jib,Java 开发者可以使用他们 ...