今天在qq群上,看到大家談到了乙個面試題,就是如何求view樹的深度。在我們專案中基本上比較少需要到這個計算,所以可能一下子會蒙圈了。
我們知道,android的檢視是一顆樹的形式,那麼即使關於android的view樹方面很多計算,便可以利用樹的原理來計算。
談到樹,我們在書本上最常看到的就是二叉樹,專案上也有很多關於樹的影子,比如有個欄目介面,欄目內容是一層套一層的,那麼也是一種樹的表現。
如果我們想獲得一顆二叉樹的深度,簡單的做法可以利用遞迴的思想來做:
int maxdeep(treenode *root)
如何理解上面幾句**?
首先root如果是null的話返回0,代表如果遍歷到葉子結點已經是空了,那麼這一層根本不算1層,所以返回0,
然後計算int max1 = maxdeep(root->left) + 1; 直接取得左子樹的深度,+1是因為root不為空,也就是當前結點不為空,那麼就要累加1層,然後再呼叫maxdeep去計算左子樹的深度
同理 int max2 = maxdeep(root->right) + 1;計算右子樹的深度
最後左右子樹哪個大就返回哪個。
那麼view樹也是同樣的道理,有人說,view樹不是二叉樹,不能這麼算吧。
這說明沒有本質上理解樹,只停留在二叉樹的**理解上。
由於上面是二叉樹,所以只需要計算左子樹右子樹,那麼如果是三叉樹呢?三叉樹那就是求左中右三個子樹,哪個層級最大便使用哪個。重點在於求各個子樹,然後比較出各個子樹之間誰是最大的層級的。
依此,view樹就是這個道理。
**如下:
private int maxdeep(view view)
viewgroup vp = (viewgroup) view;
//雖然是viewgroup,但是如果並沒有任何子view,那麼也已經是最底層view了,不能往下累加層數了,返回0,代表view下面只有0層了
if (vp.getchildcount() == 0)
//用來記錄最大層數
int max = 0;
//廣度遍歷view
for (int i = 0; i < vp.getchildcount(); i++)
}return max;
}
讀者可以自己在xml中建立幾個view層級,比如:
比如上面,如果吧rl_1這個當做根view的話。(注意這裡根view不算一層)我們自己看的話就能看得出最大深度是3
view view = findviewbyid(r.id.rl_1);
//列印出了3
log.i("222222222", maxdeep(view) + "");
Android 如何計算View的Size
注 本文參考鏈結how android caculates view size 本文例子如下所示 計算view大小的過程可以分為以下幾個步驟 確定view想要的size layoutparams 確定parent view的情況 measurespec 在parent view的限制下,根據view...
Android 如何計算View的Size
注 本文參考鏈結how android caculates view size 本文例子如下所示 計算view大小的過程可以分為以下幾個步驟 確定view想要的size layoutparams 確定parent view的情況 measurespec 在parent view的限制下,根據view...
開發者指南 Android如何繪製View
android畫的操作是由framework層來進行處理的,整個 draw是從根view開始的,viewgroup向子view發出 draw的請求,然後子view負責自己重畫它們的invalid區域。drawing乙個layout必須通過兩個步驟 1.測量。measure 從根節點到葉子節點依次測量...