Android canvas状态保存和恢复

int state = canvas.save();保存已有的画布状态
canvas.restore(); 获取到之前保存的画布状态
canvas.getSaveCount();获取保存了几次画布状态
canvas.restore();恢复画布状态(如果save()3次,只调一次restore()方法只能恢复最后一次save()的状态,调2次才会恢复到第二次save()的状态)
canvas.restoreToCount(state);恢复指定的画布状态
canvas.saveLayer(0,0, 700, 700, mPaint);保存一个离屏图层
canvas.restoreToCount(layerId);将离屏图层的绘制内容恢复到canvas

        /**
         * 1.canvas内部对于状态的保存存放在栈中
         * 2.可以多次调用save保存canvas的状态,并且可以通过getSaveCount方法获取保存的状态个数
         * 3.可以通过restore方法返回最近一次save前的状态,也可以通过restoreToCount返回指定save状态。指定save状态之后的状态全部被清除
         * 4.saveLayer可以创建新的图层,之后的绘制都会在这个图层之上绘制,直到调用restore方法
         * 注意:绘制的坐标系不能超过图层的范围, saveLayerAlpha对图层增加了透明度信息
         */

        Log.e("", "onDraw: "+canvas.getSaveCount());
        canvas.drawRect(200, 200, 700, 700, mPaint);
        int state = canvas.save();
        Log.e("", "onDraw: "+canvas.getSaveCount());
        canvas.translate(50,50);

        mPaint.setColor(Color.GRAY);
        canvas.drawRect(0,0,500,500, mPaint);

        canvas.save();
        Log.e("", "onDraw: "+canvas.getSaveCount());
        canvas.translate(50,50);
        mPaint.setColor(Color.BLUE);
        canvas.drawRect(0,0,500,500, mPaint);


        canvas.restore();
        Log.e("", "onDraw: "+canvas.getSaveCount());
//        canvas.restore();
//        canvas.restoreToCount(state);

        Log.e("", "onDraw: "+canvas.getSaveCount());
        canvas.drawLine(0,0, 400,500, mPaint);
保存恢复.png

创建离屏画布

canvas.drawRect(200,200, 700,700, mPaint);

        int layerId = canvas.saveLayer(0,0, 700, 700, mPaint);
        mPaint.setColor(Color.GRAY);
        Matrix matrix = new Matrix();
        matrix.setTranslate(100,100);
        canvas.setMatrix(matrix);
        canvas.drawRect(0,0,700,700, mPaint); //由于平移操作,导致绘制的矩形超出了图层的大小,所以绘制不完全
        canvas.restoreToCount(layerId);

        mPaint.setColor(Color.RED);
        canvas.drawRect(0,0,100,100, mPaint);
保存图层.png

在canvas.saveLayer()和canvas.restoreToCount(layerId);之间代码就可以做自己想做的事

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。