HierarchyLayout 介绍
HierarchyLayout是一个自定义的ViewGroup
工具,用于分析视图的层级关系,并画出层级树的结构图和可交互的3D 层级View
:
HiearchyLayout
的静态图,实际是可随手势改变 3D 形态的。
查看工程地址 github 点我,更多经典自定义 ViewGroup集合
使用方法
HierarchyLayout
只有一个文件,使用很简便,只需要把它当作一个普通的LinearLayout
根布局就可以。可用 xml 根布局,也可用new 构造动态添加都行。
例如 Activity 或 Fragment 的根布局使用:
<?xml version="1.0" encoding="utf-8"?>
<com.rexy.widgets.group.HierarchyLayout
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 .
</com.rexy.widgets.group.HierarchyLayout>
运行后就会出现一个层级分析界面,顶部是概要信息,层级
显示最大层级数,和平均层级数,结点
显示所有的结点总数和 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,不然会画重,详细请看源码 仅一个类。