最近重新看了一下系統(tǒng)的PhoneWindowManager類迟蜜,發(fā)現(xiàn)android所有的窗口顯示區(qū)域的坐標(biāo)都是由這個類的layoutWindowLw(WindowState win, WindowState attached)函數(shù)來計算得出來的。
該函數(shù)在每一次當(dāng)前Window有更新的時候都會調(diào)用一次娜睛,用來根據(jù)WindowState計算當(dāng)前顯示的Window顯示區(qū)域的Rect坐標(biāo),計算完畢后調(diào)用win.computeFrameLw(pf, df, of , cf , vf , dcf , sf , osf)函數(shù)進(jìn)行具體的校驗賦值操作畦戒,給具體的FrameRect賦值,最后繪制窗口View的時候通過這些Rect的坐標(biāo)就可以知道需要繪制的Window的大小了纵潦。
@Override
public void layoutWindowLw(WindowState win,WindowState attached) {
//......
final Rect pf = mTmpPatentFrame;?//當(dāng)前顯示的Window父容器顯示區(qū)域
final Rect df = mTmpDisplayFrame;?//當(dāng)前顯示的Window所有可以顯示的區(qū)域
final Rect of = mTmpOverscanFrame;?//當(dāng)前顯示的Window死區(qū)
final Rect cf = mTmpContentFrame; ?//當(dāng)前顯示的Window內(nèi)容顯示區(qū)域
final Rect vf = mTmpVisibleFrame;?//當(dāng)前顯示的Window可見區(qū)域
final Rect dcf = mTmpDecorFrame;?//當(dāng)前顯示的Window Decor區(qū)域
final Rect sf = mTmpStableFrame;
//......這一部分代碼是計算每一個Rect的大小
win.computeFrameLw(pf, df, of , cf , vf , dcf , sf , osf); //使用之前計算好的矩形區(qū)域開始計算每個Window的在顯示設(shè)備上顯示的區(qū)域與大小
//......
}