zoukankan      html  css  js  c++  java
  • Android-Canvas.save() Canvas.restore() 总结

    相信很多人和我一样看了官方文档对Canvas save(), restore()方法的解释还是一个头雾水,save()保存的到底是什么信息呢?

    答案是:坐标系的原点,坐标轴方向的信息。

    我们在使用Canvas时难免会用到transitoin(), rotate()方法来改变坐标系的原点和坐标轴的方向,save()保存的正是这些信息。

    下面举个栗子:

    该例子用Canvas绘制一个仪表盘。自定义View,在onDraw()方法中绘制该仪表盘。

     1 /**
     2  * Created by Administrator on 2015/2/1 0001.
     3  */
     4 public class ImageMatrixView extends View {
     5 
     6 
     7     public ImageMatrixView(Context context) {
     8         super(context);
     9 
    10     }
    11 
    12     public ImageMatrixView(Context context, AttributeSet attrs) {
    13         super(context, attrs);
    14 
    15     }
    16 
    17
    19     @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    20     @Override
    21     protected void onDraw(Canvas canvas) {
    22         super.onDraw(canvas);
    23        //画笔用于绘制圆和刻度
    24             Paint paintLine = new Paint();
    25             paintLine.setColor(Color.BLUE);
    26             paintLine.setStyle(Paint.Style.STROKE);
    27             paintLine.setTextSize(20);
    28         //画笔用于绘制指针
    29             Paint paintPointer = new Paint();
    30             paintPointer.setStrokeWidth(10);
    31       //获取圆的半径
    32         float radius = Math.min(getWidth() / 2, getHeight() / 2);
    33 
    34         //画圆周
    35         canvas.drawCircle(radius, radius, radius, paintLine);
    36         //变化坐标系,改变后,坐标原点在(radius, radius),x轴正方形水平向右,y轴正方向水平向下
    37         canvas.translate(radius, radius);
    38 
    39         //保存坐标系信息
    40         canvas.save();
    41 
    42         //画圆上的点
    43         for (int i = 0; i < 12; i++)
    44         {
    45             if (i % 3 == 0)
    46             {
    47                 canvas.drawLine(0, -radius, 0,  - (radius - 20), paintLine);
    48             }
    49             else
    50             {
    51                 canvas.drawLine(0, -radius, 0, -(radius - 10), paintLine);
    52             }
    53             canvas.drawText(String.valueOf(i), 0, - (radius - 24), paintLine);
    54             //将坐标系顺时针旋转30度,
    55             canvas.rotate(30, 0, 0);
    56         }
    57 
    58         //回到上次保存的状态:坐标原点在(radius, radius),x轴正方向水平向右,y轴正方向水平向下
    59         canvas.restore();
           //在保存的状态上继续改变坐标轴
    60 canvas.rotate(30);
           //绘制指针
    61 canvas.drawLine(0, 0, 40, 0, paintPointer); 62 canvas.rotate(30); 63 canvas.drawLine(0, 0, 60, 0, paintLine); 67 } 68 }

    效果图:

  • 相关阅读:
    js 提示框的实现---组件开发之(一)
    js 原型链
    js 哈希路由原理实现
    js 弹窗的实现
    js 滑动门的实现
    Delphi IDFtp用法,包含断点续传
    memortstream Base64编码和filestream base64编码不同
    Delphi另一个多线程函数:BeginThread用法
    delphi 讲的比较详细的多线程(推荐)
    多线程简单实用
  • 原文地址:https://www.cnblogs.com/gatsbydhn/p/5078537.html
Copyright © 2011-2022 走看看