android层级关系图,画出 View 的层级 3D 图和树形图来分析层级关系
HierarchyLayout 介紹
HierarchyLayout是一個(gè)自定義的ViewGroup工具,用于分析視圖的層級(jí)關(guān)系,并畫出層級(jí)樹的結(jié)構(gòu)圖和可交互的3D 層級(jí)View:
HiearchyLayout的靜態(tài)圖,實(shí)際是可隨手勢(shì)改變 3D 形態(tài)的。
hierarchyView.jpeg
hierarchyViewNode.jpeg
hierarchyNode.jpeg
使用方法
HierarchyLayout 只有一個(gè)文件,使用很簡(jiǎn)便,只需要把它當(dāng)作一個(gè)普通的LinearLayout根布局就可以。可用 xml 根布局,也可用new 構(gòu)造動(dòng)態(tài)添加都行。
例如 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 .
運(yùn)行后就會(huì)出現(xiàn)一個(gè)層級(jí)分析界面,頂部是概要信息,層級(jí)顯示最大層級(jí)數(shù),和平均層級(jí)數(shù),結(jié)點(diǎn)顯示所有的結(jié)點(diǎn)總數(shù)和 ViewGroup 型及 View 型的數(shù)目,測(cè)繪顯示的是最近一次measure layout draw 的時(shí)間。
注意 HierarchyLayout 只能分析出它自身結(jié)點(diǎn)及其包含的直接或間接子結(jié)點(diǎn)的層級(jí)關(guān)系,若將它安裝在 Activity 的DecorView下就可分析出整個(gè) Window 的層級(jí)信息。
實(shí)現(xiàn)原理分三部
作為根布局在onLayout 后 立即遞歸分析所有包含的子View信息,如結(jié)點(diǎn)類型,相對(duì)HierarchyLayout的層數(shù),位置,父親和孩子等依賴關(guān)系 并構(gòu)造一個(gè)完整的樹結(jié)構(gòu)記錄。
畫樹需要根據(jù)每層所在位置和葉子數(shù)計(jì)算權(quán)重 來(lái)決定每個(gè)結(jié)點(diǎn)在視圖上畫出的位置坐標(biāo)并畫圓,每個(gè)結(jié)點(diǎn)連接父結(jié)點(diǎn)畫線就構(gòu)成樹。
畫3D層級(jí)圖形就是在第一部基礎(chǔ)上,一層一層的計(jì)算偏移量并用view.draw(canvas)來(lái)畫某一個(gè)結(jié)點(diǎn)。所有 View 都是相對(duì)HierarchyLayout的位置,通過(guò)getLocationInWindow獲取相對(duì) Window 位置來(lái)決定 canvas需要平移的相對(duì)距離。
再結(jié)合手勢(shì)計(jì)算x 軸,y軸的旋轉(zhuǎn)度,通過(guò)canvas.rotate(x,y,0).
以上只是簡(jiǎn)要的原理,具體還涉及隱藏下一層的 View,不然會(huì)畫重,詳細(xì)請(qǐng)看源碼 僅一個(gè)類。
最后感謝大家關(guān)注和多提建議或是issue,如果很感興趣請(qǐng) star 和 follower . 完整工程地址 :
總結(jié)
以上是生活随笔為你收集整理的android层级关系图,画出 View 的层级 3D 图和树形图来分析层级关系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: NumberFormat 的使用
- 下一篇: 数据挖掘:数据仓库相关知识笔记