07.显示系统:第006节_基础知识_Region定义及操作

上小节我们讲解了surfaceflinger对Vsync信号的处理,现在我们来回顾一下,在android系统中存在一个或者多个应用程序,每个程序有一个或者多个Layer。surfaceflinger在对Vsync信号进行处理的时候,会对每一个Layer更新他的数据,接下来他就把这些更新了数据的个个层与Layer合并起来,在显示设备上显示出来。

在讲解界面显示之前,我们先来补充一些基础知识,Region定义及操作。下面是一个示意图:
在这里插入图片描述

假如上图是我们的手机屏幕,Z轴代表图像的高度。假设运行了三个应用程序,在最前面的应用程序(APP1)的z轴最大,APP2在中间位置,APP3在最下面,很显然,我们眼睛看到的APP1,他可以全部都显示出来,APP2会被APP1,遮挡一部分,同样,APP3会被APP1与2遮挡一部分,也有可能完全看不见了。

一个界面其按照透光度,可以分为3个区域:1.opaque-完全不透明。2.transparent-全透明。3.translucent-半透明。
对于不透明的程序,其会遮盖后面的程序,对于全头面的程序,他不会 遮盖后面的程序,并且全透明的区域你可以不用去绘画他。对于半透明的程序,你需要绘画半透明区域,但是他不会遮盖后面的应用程序。

我们需要一个结构体表示这些区域,这个结构体我们称之为Region,假设一个手机界面,如下:
在这里插入图片描述
Region由一系列的矩形组成,并且
1.从上到下,从左到右依次排序,
2.各矩形的Y轴坐标,要么相同(对于Y轴坐标相同的矩形,x轴坐标不交叉), 或者无交叉。

我们引入一个概念,span(一组):一组Rect,Y轴一样,x坐标无交叉。
Region:由一组Y轴无交叉的span组成。

我们查看源代码,在Region.h中

class Region : public LightFlattenable<Region>
	Vector<Rect> mStorage;

Vector mStorage;这个向量中存放着一个一个的矩形。其最后一项表示边界,如果Region只有一个Rect,那么mStorage久只含有一项,即只有一个Rect。
如果Region有两个Rect,那么mStorage含有3个Rect,这意味着mStorage永远不会有2个Rect。

下面我们开始讲解对Region的操作。我们如图:
在这里插入图片描述
假设有两个Region,但是每个Region只有一个Rect,
Region r1(0,0,2,2)
Region r2(1,1,3,3)

1.andself操作,即r1.andself(r2)-》r1 and r2。为(1,1,2,2)
2.orself,r1.orslef。即Rect(0,0,2,1),Rect(0,1,3,2),Rect(1,2,3,3),

猜你喜欢

转载自blog.csdn.net/weixin_43013761/article/details/89075444