HierarchyLayout 介绍
HierarchyLayout是一个自定义的ViewGroup工具,用于分析视图的层级关系,并画出层级树的结构图和可交互的3D 层级View:
HiearchyLayout的静态图,实际是可随手势改变 3D 形态的。
hierarchyView.jpeg
hierarchyViewNode.jpeg
hierarchyNode.jpeg
使用方法
HierarchyLayout 只有一个文件,使用很简便,只需要把它当作一个普通的LinearLayout根布局就可以。可用 xml 根布局,也可用new 构造动态添加都行。
例如 Activity 或 Fragment 的根布局使用:
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent" >
//这里是其它xml 容器或 View .
运行后就会出现一个层级分析界面,顶部是概要信息,层级显示最大层级数,和平均层级数,结点显示所有的结点总数和 ViewGroup 型及 View 型的数目,测绘显示的是最近一次measure layout draw 的时间。
注意 HierarchyLayout 只能分析出它自身结点及其包含的直接或间接子结点的层级关系,若将它安装在 Activity 的DecorView下就可分析出整个 Window 的层级信息。
实现原理分三部
作为根布局在onLayout 后 立即递归分析所有包含的子View信息,如结点类型,相对HierarchyLayout的层数,位置,父亲和孩子等依赖关系 并构造一个完整的树结构记录。
画树需要根据每层所在位置和叶子数计算权重 来决定每个结点在视图上画出的位置坐标并画圆,每个结点连接父结点画线就构成树。
画3D层级图形就是在第一部基础上,一层一层的计算偏移量并用view.draw(canvas)来画某一个结点。所有 View 都是相对HierarchyLayout的位置,通过getLocationInWindow获取相对 Window 位置来决定 canvas需要平移的相对距离。
再结合手势计算x 轴,y轴的旋转度,通过canvas.rotate(x,y,0).
以上只是简要的原理,具体还涉及隐藏下一层的 View,不然会画重,详细请看源码 仅一个类。
最后感谢大家关注和多提建议或是issue,如果很感兴趣请 star 和 follower . 完整工程地址 :