Android canvas.save() canvas.restore();

@[TOC] Android canvas.save() canvas.restore();

Android canvas.save() canvas.restore();

  • canvas.save()首先看文档注释:

Saves the current matrix and clip onto a private stack.
Subsequent calls to translate,scale,rotate,skew,concat or clipRect, clipPath will all operate as usual, but when the balancing call to restore() is made, those calls will be forgotten, and the settings that existed before the save() will be reinstated.
保存当前矩阵并剪辑到私有堆栈上。
随后调用translate、scale、rotate、skew、concat或cliprect、clippath都将照常操作,但当进行调用restore()时,这些调用将被忽略,并且将恢复save()之前存在的设置。

意思是canvas.save()方法将会保存当前的canvas变换的信息,并且会把这个save动作放到一个私有栈里。

  • canvas.restore()

This call balances a previous call to save(), and is used to remove all modifications to the matrix/clip state since the last save call. It is an error to call restore() more times than save() was called.
此调用将平衡以前的save()调用,并用于删除自上次save调用以来对matrix/clip状态的所有修改。调用restore()的次数多于调用save()的次数是错误的。

即将canvas的变换状态恢复到上一次save动作时的状态。

  • 看个例子:
 / //绘制矩形
        canvas.drawRect(drawRect, mPaint);

        //平移一次,再绘制矩形
        canvas.translate(50, 50);
        mPaint.setColor(Color.argb(255, 50, 50, 1));
        canvas.drawRect(drawRect, mPaint);

        //平移一次,再绘制矩形
        canvas.translate(50, 50);
        mPaint.setColor(Color.argb(255, 100, 0, 0));
        canvas.drawRect(drawRect, mPaint);

在这里插入图片描述 现在我要绘制第四个矩形,蓝色,在初始位置绘制,既要修改代码:

 //绘制矩形
        canvas.drawRect(drawRect, mPaint);
        //保存当前canvas的变换信息
        canvas.save();

        //平移一次,再绘制矩形
        canvas.translate(50, 50);
        mPaint.setColor(Color.argb(255, 50, 50, 1));
        canvas.drawRect(drawRect, mPaint);

        //平移一次,再绘制矩形
        canvas.translate(50, 50);
        mPaint.setColor(Color.argb(255, 100, 0, 0));
        canvas.drawRect(drawRect, mPaint);

        //恢复到0,0点
        canvas.restore();
        mPaint.setColor(Color.BLUE);
         //此绘制将会覆盖第一次在0,0点绘制的黑色的矩形。
        canvas.drawRect(drawRect,mPaint);

在这里插入图片描述

  • 我们也可以调用多次canvas.save()方法,每次都会保存当前的变换状态,我们也可以指定恢复到某次save()动作时的状态,调用canvas.restoreToCount(int saveCount)方法即可。注意,调用restoreToCount的次数不能大于调用save()的次数。

  • 示例:

 //绘制矩形
        canvas.drawRect(drawRect, mPaint);
        //保存当前的变换状态
        canvas.save();

        //平移一次,再绘制矩形
        canvas.translate(50, 50);
        mPaint.setColor(Color.argb(255, 50, 50, 1));
        canvas.drawRect(drawRect, mPaint);
        canvas.save();

        //平移一次,再绘制矩形
        canvas.translate(50, 50);
        mPaint.setColor(Color.argb(255, 100, 0, 0));
        canvas.drawRect(drawRect, mPaint);
        canvas.save();

        //恢复到第2次save时的状态变换状态(canvas坐标回到了(50,50)点。)
        canvas.restoreToCount(2);
        mPaint.setColor(Color.BLUE);
        canvas.drawRect(drawRect, mPaint);

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值