HierarchyLayout 介紹
HierarchyLayout是一個自定義的ViewGroup
工具,用于分析視圖的層級關(guān)系锤灿,并畫出層級樹的結(jié)構(gòu)圖和可交互的3D 層級View
:
HiearchyLayout
的靜態(tài)圖兼耀,實際是可隨手勢改變 3D 形態(tài)的絮短。
hierarchyView.jpeg
hierarchyViewNode.jpeg
hierarchyNode.jpeg
查看工程地址 github 點我填抬,更多經(jīng)典自定義 ViewGroup集合
使用方法
HierarchyLayout
只有一個文件翻默,使用很簡便臼婆,只需要把它當(dāng)作一個普通的LinearLayout
根布局就可以抒痒。可用 xml 根布局颁褂,也可用new 構(gòu)造動態(tài)添加都行故响。
例如 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>
運行后就會出現(xiàn)一個層級分析界面,頂部是概要信息颁独,層級
顯示最大層級數(shù)彩届,和平均層級數(shù),結(jié)點
顯示所有的結(jié)點總數(shù)和 ViewGroup 型及 View 型的數(shù)目誓酒,測繪
顯示的是最近一次measure layout draw 的時間樟蠕。
注意 HierarchyLayout
只能分析出它自身結(jié)點及其包含的直接或間接子結(jié)點的層級關(guān)系,若將它安裝在 Activity 的DecorView
下就可分析出整個 Window 的層級信息靠柑。
實現(xiàn)原理分三部
- 作為根布局在onLayout 后 立即遞歸分析所有包含的子
View
信息寨辩,如結(jié)點類型,相對HierarchyLayout
的層數(shù)歼冰,位置捣染,父親和孩子等依賴關(guān)系 并構(gòu)造一個完整的樹結(jié)構(gòu)記錄。 - 畫樹需要根據(jù)每層所在位置和葉子數(shù)計算權(quán)重 來決定每個結(jié)點在視圖上畫出的位置坐標(biāo)并畫圓停巷,每個結(jié)點連接父結(jié)點畫線就構(gòu)成樹耍攘。
- 畫3D層級圖形就是在第一部基礎(chǔ)上,一層一層的計算偏移量并用view.draw(canvas)來畫某一個結(jié)點畔勤。所有 View 都是相對
HierarchyLayout
的位置蕾各,通過getLocationInWindow獲取相對 Window 位置來決定 canvas需要平移的相對距離。
再結(jié)合手勢計算x 軸庆揪,y軸的旋轉(zhuǎn)度式曲,通過canvas.rotate(x,y,0).
以上只是簡要的原理,具體還涉及隱藏下一層的 View缸榛,不然會畫重吝羞,詳細(xì)請看源碼 僅一個類。