今天在QQ群上,看到大家谈到了一个面试题,就是如何求View树的深度。在我们项目中基本上比较少需要到这个计算,所以可能一下子会蒙圈了。
我们知道,Android的视图是一颗树的形式,那么即使关于Android的View树方面很多计算,便可以利用树的原理来计算。
谈到树,我们在书本上最常看到的就是二叉树,项目上也有很多关于树的影子,比如有个栏目接口,栏目内容是一层套一层的,那么也是一种树的表现。

如果我们想获得一颗二叉树的深度,简单的做法可以利用递归的思想来做:

int maxDeep(TreeNode *root){if(root == NULL)return 0;int max1 = maxDeep(root->left) + 1;int max2 = maxDeep(root->right) + 1;return (max1 > max2) ? max1 : max2;}

如何理解上面几句代码?

首先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) {        //当前的view已经是最底层view了,不能往下累加层数了,返回0,代表view下面只有0层了        if (!(view instanceof ViewGroup)) {            return 0;        }        ViewGroup vp = (ViewGroup) view;        //虽然是viewgroup,但是如果并没有任何子view,那么也已经是最底层view了,不能往下累加层数了,返回0,代表view下面只有0层了        if (vp.getChildCount() == 0) {            return 0;        }        //用来记录最大层数        int max = 0;        //广度遍历view        for (int i = 0; i < vp.getChildCount(); i++) {            //由于vp拥有子view,所以下面还有一层,因为可以+1,来叠加一层,然后再递归几岁算它的子view的层数            int deep = maxDeep(vp.getChildAt(i)) + 1;            //比较哪个大就记录哪个            if (deep > max) {                max = deep;            }        }        return max;    }

读者可以自己在XML中建立几个view层级,比如:

                                                                                                             

比如上面,如果吧rl_1这个当做根View的话。(注意这里根View不算一层)我们自己看的话就能看得出最大深度是3

    View view = findViewById(R.id.rl_1);    //打印出了3    Log.i("222222222", maxDeep(view) + "");

更多相关文章

  1. Android窗口管理服务WindowManagerService计算窗口Z轴位置的过程
  2. Android(安卓)OpenGLES2.0(五)——绘制立方体
  3. android 和云计算
  4. :开源社区是个好地方:第一个android小程序【简易计算器】
  5. Android(安卓)学习方法
  6. Android应用程序开发以及背后的设计思想深度剖析(1)
  7. 初级android面试经验1.0
  8. Android简单计算器实现
  9. Android简易计算器----布局_菜单_提示框 的运用

随机推荐

  1. Android的7种进度条样式
  2. android 考研appwidget的实现
  3. Android(安卓)App常用图标尺寸规范
  4. Android(安卓)shell 系统命令大全
  5. android:hintText与android:inputType详
  6. 安装好android的adt以后重启eclipse,但是
  7. Android(安卓)内存数据库
  8. 使用 Eclipse PhoneGap 构建 Android(安
  9. android Notification 的使用
  10. Android设置透明、半透明等效果