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()方法应用 - Gobby.X - Gobby.X




    本文转自 一点点征服   博客园博客,原文链接:http://www.cnblogs.com/ldq2016/p/6664977.html ,如需转载请自行联系原作者


相关文章
|
2天前
|
JavaScript 前端开发 开发者
call 方法和 apply 方法的区别是什么?
【10月更文挑战第26天】`call` 方法和 `apply` 方法的主要区别在于参数传递方式和使用场景。开发者可以根据具体的函数参数情况和代码的可读性、简洁性要求来选择使用 `call` 方法还是 `apply` 方法,以实现更高效、更易读的JavaScript代码。
10 2
|
1月前
|
JavaScript 前端开发
js 中call()和apply()
js 中call()和apply()
27 1
|
2月前
|
Rust 编译器 C++
使用 def、cdef、cpdef 创建函数
使用 def、cdef、cpdef 创建函数
24 0
|
JavaScript
vue.set()与this.$set()用法与区别
vue.set()与this.$set()用法与区别
169 0
|
Java 应用服务中间件 容器
getParameter()与 getAttribute()的用法与区别
getParameter()与 getAttribute()的用法与区别
266 0
YII2 save 和 insert 循环保存数据,出现间隔性丢失值 (这些值是共有相同的值) 解决: // 每次保存需要用 clone 不能使用直接用一个 实例化的model.
YII2 save 和 insert  循环保存数据,出现间隔性丢失值 (这些值是共有相同的值) 解决:  // 每次保存需要用 clone 不能使用直接用一个 实例化的model. $_model = clone $timeTask;$_model->setAttributes($save);if ( ! $_model->save()) {参考: http://www.
1758 0
List的Clear方法与RemoveAll方法用法小结
List的Clear方法与RemoveAll方法用法小结http://www.bieryun.com/1055.html 示例代码 [csharp] view plain copy using System; using System.
2372 0