獲取View(ViewGroup)的深度

/**
 * 獲取View的深度/層級
 * @param view
 * @return
 */
public int getViewLevel(View view) {
    int level = 0;
    if(null == view) {
        return level;
    }
    if(view instanceof ViewGroup) {
        ViewGroup viewGroup = (ViewGroup) view;
        //用於遍歷所以的Viewgroup  保證循環繼續下去
        LinkedList<View> queue = new LinkedList();
        queue.add(viewGroup);
        while(!queue.isEmpty()) {
            //層級加1;
            level++;
            //這裏需要獲取size後再循環,不然,一邊循環,一邊後面循環到的ViewGroup類型的View還有子孩子的話,
            // 會繼續添加,下面的第一層for就會一直循環(如果使用i < queue.size()的方式的話)
            //這裏是獲取層級,所以需要在level++後,將list中當前的View給遍歷完,相當於遍歷的是當前的一層
            //如果遍歷完當前List中的view(當前的一層)後,while循環發現List依然不是空的,則說明後面添加
            //了新的控件,而且是當前一層的所有有子孩子的ViewGroup的所有子孩子控件,這就是下一層了,
            //當然while就會再次進入循環內,就再次執行了level++;層級就+1了
            int size = queue.size();//這裏需要獲取size後再循環
            for (int i = 0; i < size; i++) {
                View view1 = queue.removeFirst();
                ViewGroup groupItem;
                //循環隊列,把當前隊列的Viewgroup類型的子孩子添加到後面
                if(view1 instanceof ViewGroup && (groupItem = (ViewGroup) view1).getChildCount() > 0){
                    for (int j = 0; j < groupItem.getChildCount(); j++) {
                        queue.addLast(groupItem.getChildAt(j));
                    }
                }
            }
        }
    }else {
        level = 1;
    }
    return level;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章