上小節我們講解了surfaceflinger對Vsync信号的處理,現在我們來回顧一下,在android系統中存在一個或者多個應用程式,每個程式有一個或者多個Layer。surfaceflinger在對Vsync信号進行處理的時候,會對每一個Layer更新他的資料,接下來他就把這些更新了資料的個個層與Layer合并起來,在顯示裝置上顯示出來。
在講解界面顯示之前,我們先來補充一些基礎知識,Region定義及操作。下面是一個示意圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPR1kMjpXT4FkeNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmL1IjMwIDM0kTM3ADNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
假如上圖是我們的手機螢幕,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),