平移、缩放、旋转等操作等于是,我在一个正的画布绘制好图,然后再把画布做旋转、平移、缩放等等的效果。

也就是说,我使用的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()方法应用的更多相关文章

  1. canvas中save()和restore()方法

    save()和restore()方法是绘制复杂图形不可缺少的方法它们是分别用来保存和恢复canvas状态的,都没有参数 save():用来保存Canvas的状态.save之后,可以调用Canvas的平 ...

  2. HTML5中canvas的save和restore方法

    canvas的save和restore方法: save() 方法把当前绘画状态的一份拷贝压入到一个保存图像状态的栈中.这里的绘画状态指坐标原点.变形时的变化矩阵(该矩阵是调用 rotate().sca ...

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

    <span style="font-size:18px;"> </span> <span style="font-size:18px;&qu ...

  4. canvas的save与restore方法的作用

    网上搜罗了一堆资料,最后总结一下. save:用来保存Canvas的状态.save之后,可以调用Canvas的平移.放缩.旋转.错切.裁剪等操作. restore:用来恢复Canvas之前保存的状态. ...

  5. HTML5 canvas save()和restore()方法讲解

    我们尝试用这个连续矩形的例子来描述 canvas 的状态堆是如何工作的.第一步是用默认设置画一个大四方形,然后保存一下状态.改变填充颜色画第二个小一点的白色四方形,然后再保存一下状态.再次改变填充颜色 ...

  6. canvas 中save和restore的用法

    在创建新的控件或修改现有的控件时,我们都会涉及到重写控件或View的onDraw方法. onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布. 在onDraw方法里,我们经常会 ...

  7. [js高手之路] html5 canvas系列教程 - 状态详解(save与restore)

    本文内容与路径([js高手之路] html5 canvas系列教程 - 开始路径beginPath与关闭路径closePath详解)是canvas中比较重要的概念.掌握理解他们是做出复杂canvas动 ...

  8. canvas 图片拖拽旋转之二——canvas状态保存(save和restore)

    引言 在上一篇日志“canvas 图片拖拽旋转之一”中,对坐标转换有了比较深入的了解,但是仅仅利用坐标转换实现的拖拽旋转,会改变canvas坐标系的状态,从而影响画布上其他元素的绘制.因此,这个时候需 ...

  9. Canvas的save和restore

    在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的呢? int px = getMeasuredWidth(); int py = getMeasuredWid ...

随机推荐

  1. JavaSE——Java对象导论

    一.抽象过程 人们所能够解决问题的复杂性直接取决于抽象的类型和质量.所谓抽象的类型指的是抽象的是什么,汇编语言是对底层机器的轻微抽象,命令式语言(FORTRAN.BASIC.C)是对汇编语言的抽象.这 ...

  2. Java技术——Java反射机制分析

    )生成动态代理. 2. Java反射API 反射API用来生成在当前Java虚拟机中的类.接口或者对象的信息. Class类:反射的核心类,可以获取类的属性,方法等内容信息. Field类:Java. ...

  3. Python并发(二)

    并发是指一次处理多件事,而并行是指一次做多件事.二者不同,但互相有联系.打个比方:像Python的多线程,就是并发,因为Python的解释器GIL是线程不安全的,一次只允许执行一个线程的Python字 ...

  4. luogu2580 于是他错误的点名开始了 Trie树

    模板题 #include <iostream> #include <cstring> #include <cstdio> using namespace std; ...

  5. luogu1939 【模板】矩阵加速(数列)

    upd:现在推荐使用一个长度为 \(n\) 的一维向量.若状态矩阵 \(F\) 对下一时间的状态矩阵 \(F'\) 有影响,则 \(F'=FA\) 中的 转移矩阵 \(A\) 的赋值方法是: 若状态矩 ...

  6. 探究灰度测试(A/B Testing)

    一段小插曲 前段时间产品改版,产品经理为了改进用户体验,就决定改版用户的注册流程页面,但又怕身份证注册验证接口不稳定(第三方的身份证校验). 于是产品经理就让我通过随机概率去控制注册流程,让一部分用户 ...

  7. [PDOException] SQLSTATE[HY000] [2002] No such file or directory

    编译安装PHP7之后,在安装mysql之后,用pdo操作数据库的时候,出现了此错误[PDOException] SQLSTATE[HY000] [2002] No such file or direc ...

  8. jQuery 样式操作、文档操作、属性操作的方法总结

    文档操作: addClass()             向匹配的元素添加指定的类名.after()                    在匹配的元素之后插入内容.append()         ...

  9. Mysql 数值类型

    Mysql数值类型 整数型 小数型(浮点数) 日期时间型

  10. Bash Command 1: find

    GNU find searches the directory tree rooted at each given starting-point by evaluating the given exp ...