欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

自定义View画布save()和restore()

程序员文章站 2024-03-24 08:58:52
...

遇到这两个防法正好记录一下,有一个简单的例子,画一个钟表的刻度盘,首先画圆,然后通过旋转画布画刻度,下面主要代码:

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        /**
         * 画圆
         */
        canvas.drawCircle(mWidth / 2, mHeight / 2, mWidth / 2, mPaint);
        /**
         * 画12点位置
         */
        canvas.drawLine(mWidth / 2, mHeight / 2 - mWidth / 2, mWidth / 2, mHeight / 2 - mWidth / 2 + 50, mPaint);
        /**
         * 画中心点
         */
        canvas.drawPoint(mWidth / 2, mHeight / 2, mPaint);
        /**
         * 旋转画布画画其他位置的刻度
         */
        for (int i = 0; i < 11; i++) {
            canvas.rotate(30, mWidth / 2, mHeight / 2);
            canvas.drawLine(mWidth / 2, mHeight / 2 - mWidth / 2, mWidth / 2, mHeight / 2 - mWidth / 2 + 50, mPaint);
        }
    }

效果图:

自定义View画布save()和restore()

那么现在修改代码添加两个放法save,和restore如下代码所示:

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        /**
         * 画圆
         */
        canvas.drawCircle(mWidth / 2, mHeight / 2, mWidth / 2, mPaint);
        /**
         * 画12点位置
         */
        canvas.drawLine(mWidth / 2, mHeight / 2 - mWidth / 2, mWidth / 2, mHeight / 2 - mWidth / 2 + 50, mPaint);
        /**
         * 画中心点
         */
        canvas.drawPoint(mWidth / 2, mHeight / 2, mPaint);
        /**
         * 旋转画布画画其他位置的刻度
         */
        for (int i = 0; i < 11; i++) {
            canvas.save();
            canvas.rotate(30, mWidth / 2, mHeight / 2);
            canvas.restore();
            canvas.drawLine(mWidth / 2, mHeight / 2 - mWidth / 2, mWidth / 2, mHeight / 2 - mWidth / 2 + 50, mPaint);
        }
    }
效果图如下:

自定义View画布save()和restore()

总结:好了我们看到了所有的刻度都画在12点了,为什么,在一般情况下save放法和restore一般是成对调用的,save放法用于保存当前画布状态,而restore放法则是回复之前保存的画布的状态,在本例中,我再旋转画布之前进行保存画布状态,(此时保存的画布状态是没有经过旋转的),我在旋转之后调用restore恢复之前保存的状态,所以目前的画布状态仍然是没有旋转过的,所以所有的刻度都画在12点位置,不知道明白了没有,在save和restore一般进行画布的旋转缩放平移等操作,最后再用箭头表示一下画布的状态。

自定义View画布save()和restore()