天天看点

Android 自定义控件canvas- Layer图层Android layer图层是什么?

Android layer图层是什么?

从字面上看android中的layer就是图层的意思,一般用于android中自定义控件的绘制中。从字面上意思看很像photoshop中的图层概念,也就是说大于1张图层以上重叠的图层组,从而可以创建一个复杂的图层,photoshop里面一张漂亮的画都是由多张图层来完成的。在android中layer是跟canvs配合使用,创建一个图层可以使用canvas.saveLayer()来创建,图层是基于栈结构进行管理的。

如图:

Android 自定义控件canvas- Layer图层Android layer图层是什么?

Android layer图层做什么?

Layer作用当然就是做复杂的界面,Android通过调用saveLayer()方法或者是saveLayerAlpha()方法将一个图层入栈,使用restore()方法、restoreToCount()方法将一个图层出栈。然而入栈的时候,后面所有的操作都发送在这个入栈的图层之上,而出栈的时候,则会把图像会知道上层的Canvas上。接下来通过代码来看看如何使用Layer。

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //图层一
        canvas.drawColor(Color.WHITE);//白色底色图层
        mPaint.setColor(Color.BLACK);
        canvas.drawCircle(, , , mPaint);//黑色圆形

        //图层二
        canvas.saveLayerAlpha(, , , , , Canvas.ALL_SAVE_FLAG);
        mPaint.setColor(Color.YELLOW);
        canvas.drawCircle(, , , mPaint);//黄色圆形
        canvas.restore();//合并
    }
           

运行后效果:

Android 自定义控件canvas- Layer图层Android layer图层是什么?

介绍一下saveLayerAlpha()参数如下:

Android 自定义控件canvas- Layer图层Android layer图层是什么?

参数12345分别如下:

左上右下,alpha透明度,参数的取值是0到255 。127半透明效果,255完全不透明,0完全透明。所以图层就如

Android 自定义控件canvas- Layer图层Android layer图层是什么?
Android 自定义控件canvas- Layer图层Android layer图层是什么?
Android 自定义控件canvas- Layer图层Android layer图层是什么?

接下来要解释一下

Android 自定义控件canvas- Layer图层Android layer图层是什么?

saveFlags:代表了需要保存哪方面的内容,这里一共有6种取值,分别是:

Android 自定义控件canvas- Layer图层Android layer图层是什么?

如图1

(1)MATRIX_SAVE_FLAG(首先我们把透明度Alpha设置255完全不透明)

Android 自定义控件canvas- Layer图层Android layer图层是什么?

MATRIX_SAVE_FLAG:意思是只保存图层的matrix矩阵。

Android对于图片的处理,最长使用到的数据结构是位图–Bitmap,他包含了一张图片的所有数据。整个图片独食由点阵和颜色值组成的,所谓点阵就是一个包含像素的矩阵,每个元素对应图片的一个像素点。

我们来看Bitmap源码就会发现

Android 自定义控件canvas- Layer图层Android layer图层是什么?
Android 自定义控件canvas- Layer图层Android layer图层是什么?

从canvas的构造函数中也可以看出matrix影子,canvas绘制会发生在Bitmap身上,bitmap的操作也是通过matrix来进行的。 运行效果:

Android 自定义控件canvas- Layer图层Android layer图层是什么?

(2)CLIP_SAVE_FLAG

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //图层一
        canvas.drawColor(Color.WHITE);
        mPaint.setColor(Color.BLACK);
        canvas.drawCircle(, , , mPaint);

        //图层二
        canvas.saveLayerAlpha(, , , ,, Canvas.CLIP_SAVE_FLAG);
        mPaint.setColor(Color.YELLOW);
        canvas.drawCircle(, , , mPaint);
        canvas.restore();
    }
           

运行后,与(1)结果相同,效果相同主要就是保存裁剪的相关信息。

(3)HAS_ALPHA_LAYER_SAVE_FLAG和FULL_COLOR_LAYER_SAVE_FLAG

HAS_ALPHA_LAYER_SAVE_FLAG为layer添加一个透明通道,这样一来没有绘制的地方就是透明的,覆盖到上一个layer的时候,就会显示出上一层的图像。而FULL_COLOR_LAYER_SAVE_FLAG 则会完全展示当前layer的图像,清除掉上一层的重合图像。

(4)CLIP_TO_LAYER_SAVE

Android 自定义控件canvas- Layer图层Android layer图层是什么?
//图层一
        canvas.drawColor(Color.RED);
        mPaint.setColor(Color.WHITE);
        //图层二
        canvas.saveLayer(, , , , mPaint, Canvas.CLIP_SAVE_FLAG);//裁剪后保存,底色红色
        mPaint.setColor(Color.YELLOW);
        canvas.drawCircle(, , , mPaint);
        canvas.restore();
           

这里可以看出裁切之后,原来图层和裁切后的图层继续合并了

(5)CLIP_TO_LAYER_SAVE_FLAG

Android 自定义控件canvas- Layer图层Android layer图层是什么?
//图层一
        canvas.drawColor(Color.RED);
        mPaint.setColor(Color.WHITE);
        //图层二
        canvas.saveLayer(, , , , mPaint, Canvas.CLIP_TO_LAYER_SAVE_FLAG);
        mPaint.setColor(Color.YELLOW);
        canvas.drawCircle(, , , mPaint);
        canvas.restore();
           

这里可以看出来只保存裁切后的图层。

canvas.saveLayerAlpha()与 canvas.saveLayer()区别;

canvas.saveLayerAlpha()就是创建一个带有透明度图层的图层, canvas.saveLayer()创建一个透明图层竟此而已。