-UI调试工具 SAK 布局 MD
目錄
- 目錄
- SwissArmyKnife
- 接入方式
- 自動(dòng)初始化版本
- 支持的功能
- 可配置項(xiàng)
- 原理
- 自定義功能
| MyAndroidBlogs | baiqiantao | baiqiantao | bqt20094 | baiqiantao@sina.com |
目錄
SwissArmyKnife
SwissArmyKnife
autopilot 分支
效果視頻
SwissArmyKnife 是一款方便調(diào)試android UI的工具。可以直接在android設(shè)備屏幕上顯示控件的相關(guān)信息
接入方式
compile 'com.wanjian:sak:2.0.2'no opt 包
compile 'com.wanjian:sak-nop:0.0.3' //開啟 SAK.init(Application application, Config config)//關(guān)閉 SAK.unInstall();啟動(dòng)app后會(huì)在屏幕右側(cè)看到一個(gè) 藍(lán)色靶心 ,雙擊即可進(jìn)入功能界面。
Tips:
當(dāng)開啟新窗口時(shí)(包括新的Activity、彈出dialog、pop),需要手動(dòng)點(diǎn)擊一次屏幕右側(cè)的 靶心 按鈕,以此激活當(dāng)前窗口,不然當(dāng)前窗口不會(huì)啟用 SwissArmyKnife!
自動(dòng)初始化版本
自動(dòng)初始化版本
Autopilot 版基于com.wanjian:sak:xx.xx.xx,實(shí)現(xiàn)了自動(dòng)初始化,只需要在gradle中引入依賴即可,不需要編寫額外的初始化代碼
接入方式
compile 'com.wanjian:sak-autopilot:2.0.1'no opt 包
compile 'com.wanjian:sak-nop:0.0.3'開啟及關(guān)閉
在控制臺(tái)執(zhí)行?adb shell am broadcast -a com.sak命令即可開啟及關(guān)閉
支持的功能
Tips:
編輯控件、相對距離、移動(dòng)控件,這幾個(gè)功能相互沖突,請勿同時(shí)開啟
常用的功能
- Activity、Fragment名稱:可以看到當(dāng)前Activity的類名,每一個(gè)Fragment的類名。
- 相對距離:依次長按兩個(gè)控件即可顯示兩個(gè)控件間的水平和豎直距離
- 拾取控件:拖動(dòng)圓環(huán)到要拾取的控件位置,可以獲取控件id、類型、位置、背景色、寬高、邊距、字體大小顏色等信息
- 取色器:會(huì)在屏幕顯示綠色圓環(huán),可以任意拖動(dòng),屏幕下方會(huì)顯示圓環(huán)中心的顏色值(圓環(huán)的顏色也會(huì)改變)
- 水平直尺、豎直直尺:會(huì)在屏幕顯示水平直尺和豎直直尺,可以任意拖動(dòng)進(jìn)行測量,直尺上有px和dp兩個(gè)值
- 邊框:顯示所有View的邊界(類似開發(fā)者選項(xiàng)中的"顯示布局邊界"功能)
其他支持的功能
- 編輯控件:長按需要編輯的控件即可彈出編輯窗口,可以修改內(nèi)外邊距大小、寬高、背景色、字體顏色大小等
- 移動(dòng)控件:長按控件即可拖動(dòng)
- Scalpel:解剖刀,會(huì)立體顯示view,可以直觀的查看view的層級關(guān)系,拖動(dòng)屏幕左側(cè)的按鈕可以切換角度
- 網(wǎng)格:顯示網(wǎng)格
- 字體大小:顯示所有TextView的大小
- 字體顏色:顯示所有TextView的顏色
- 外邊距:顯示所有View的外邊距(Margin)的大小(會(huì)填充一個(gè)背景色)
- 內(nèi)邊距:顯示所有View的內(nèi)邊距(Padding)的大小(會(huì)填充一個(gè)背景色)
- 寬高:顯示所有View的寬高
- 圖片寬高:顯示所有ImageView的寬高
- 背景色:顯示所有設(shè)置background的控件的背景色的值
- 自定義信息:
- View類型:顯示所有View的類型
- 布局樹:顯示布局樹
- 性能:可以看到當(dāng)前窗口view的繪制耗時(shí)、事件分發(fā)耗時(shí)、measure耗時(shí)、layout耗時(shí)、handler耗時(shí)等信息
- 開啟后會(huì)自動(dòng)禁用硬件加速,實(shí)際繪制時(shí)間可能要少一些
- ListView會(huì)在事件分發(fā)時(shí)調(diào)用getView,所以ListView事件分發(fā)時(shí)間稍微長一些
- RecyclerView會(huì)在view繪制時(shí)bindView,所以RecyclerView繪制時(shí)間會(huì)稍長一些
可配置項(xiàng)
可配置項(xiàng)
- 層級區(qū)間:Fragment名稱、外邊距、內(nèi)邊距、寬高、字體大小、字體顏色、背景色等功能下,可以通過設(shè)置層級區(qū)間過濾掉部分view,避免數(shù)值相互覆蓋
- 單位:距離默認(rèn)單位是dp,可以切換為dp、sp、px單位
- 裁剪繪制范圍:若內(nèi)外邊距、寬高、字體顏色等信息不顯示,可以關(guān)閉 裁剪繪制。開啟該功能可以避免可以滾動(dòng)的控件滾動(dòng)后導(dǎo)致的信息覆蓋問題。
原理
實(shí)現(xiàn)過程:
- 監(jiān)聽window的創(chuàng)建,從而拿到每一個(gè)window的根view。
- 拿到根view(必須是FrameLayout或RelativeLayout)后給根view添加RootContainerView,RootContainerView內(nèi)部包含了藍(lán)色的靶心view。每個(gè)window都有一個(gè)專用的RootContainerView。
- 創(chuàng)建各window共用的DashBoardView,DashBoardView是其他各功能view的容器,比如開啟取色功能后會(huì)把TakeColorView加到DashBoardView中。
- 雙擊當(dāng)前窗口的靶心按鈕會(huì)在當(dāng)前窗口激活 SwissArmyKnife,其實(shí)是把共用的DashBoardView添加到了當(dāng)前窗口的RootContainerView中。
- 每一個(gè)功能都是AbsLayer的子類,AbsLayer繼承自FrameLayout。當(dāng)當(dāng)前窗口的任何一個(gè)view需要繪制時(shí)都會(huì)調(diào)用AbsLayer的onUiUpdate方法,可以在該方法里繪制相關(guān)信息,比如邊框,字體顏色等。
自定義功能
可以通過 Config 對 SAK 進(jìn)行配置或自定義功能。
public class App extends Application {@Overridepublic void onCreate() {super.onCreate();Config config = new Config.Build(this).viewFilter(getViewFilter()).addLayerView(getLayerView()).addSizeConverter(getSizeConverter()).build();SAK.init(this, config);}private ISizeConverter getSizeConverter() {return new ISizeConverter() {// 可以添加自定義的SizeConverter,默認(rèn)提供了Origin*、Px2Dp*,Px2Sp*@Overridepublic String desc() {return "my converter";}@Overridepublic Size convert(Context context, float length) {return Size.obtain().setLength(length / 2).setUnit("myU");}@Overridepublic int recovery(Context context, float length) {return 0;}};}private AbsLayer getLayerView() {// 可以添加自定義的view,自定義的view要繼承自AbsLayer或其子類,AbsLayer是FrameLayout的子類// 當(dāng)激活SwissArmyKnife時(shí)會(huì)調(diào)用 onAttached(View rootView)方法,rootView是當(dāng)前window的根view,比如Activity的根view DecorView。//當(dāng)停用是會(huì)調(diào)用`onDetached`return new AbsLayer(this) {@Overridepublic String description() {return null;}@Overridepublic Drawable icon() {return null;}};}private ViewFilter getViewFilter() {return new ViewFilter() {@Overridepublic boolean apply(View view) {// 這里可以決定要顯示哪種view,比如只顯示ImageView子類和LinearLayout子類// 若想要顯示所有可見的view,直接返回 view.getVisibility()==View.VISIBLE 即可return view instanceof ImageView || view instanceof LinearLayout;}};} }2019-6-30
轉(zhuǎn)載于:https://www.cnblogs.com/baiqiantao/p/11108512.html
總結(jié)
以上是生活随笔為你收集整理的-UI调试工具 SAK 布局 MD的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VISTA下载全集(下)
- 下一篇: 经典冒泡排序法