博文地址

我的GitHub 我的博客 我的微信 我的邮箱
baiqiantao baiqiantao bqt20094 baiqiantao@sina.com

目录

SwissArmyKnife

SwissArmyKnife 是一款方便调试android UI的工具。可以直接在android设备屏幕上显示控件的相关信息

接入方式

  1. compile 'com.wanjian:sak:2.0.2'
  2. //no opt 包
  3. compile 'com.wanjian:sak-nop:0.0.3'
  1. //开启
  2. SAK.init(Application application, Config config)
  3. //关闭
  4. SAK.unInstall();

启动app后会在屏幕右侧看到一个 蓝色靶心双击即可进入功能界面。

Tips:

当开启新窗口时(包括新的Activity、弹出dialog、pop),需要手动点击一次屏幕右侧的 靶心 按钮,以此激活当前窗口,不然当前窗口不会启用 SwissArmyKnife!

自动初始化版本

自动初始化版本

Autopilot 版基于com.wanjian:sak:xx.xx.xx,实现了自动初始化,只需要在gradle中引入依赖即可,不需要编写额外的初始化代码

接入方式

  1. compile 'com.wanjian:sak-autopilot:2.0.1'
  2. //no opt 包
  3. compile 'com.wanjian:sak-nop:0.0.3'

开启及关闭

在控制台执行 adb shell am broadcast -a com.sak命令即可开启及关闭

支持的功能

Tips:

编辑控件、相对距离、移动控件,这几个功能相互冲突,请勿同时开启

常用的功能

  • Activity、Fragment名称:可以看到当前Activity的类名,每一个Fragment的类名。
  • 相对距离:依次长按两个控件即可显示两个控件间的水平和竖直距离
  • 拾取控件:拖动圆环到要拾取的控件位置,可以获取控件id、类型、位置、背景色、宽高、边距、字体大小颜色等信息
  • 取色器:会在屏幕显示绿色圆环,可以任意拖动,屏幕下方会显示圆环中心的颜色值(圆环的颜色也会改变)
  • 水平直尺、竖直直尺:会在屏幕显示水平直尺和竖直直尺,可以任意拖动进行测量,直尺上有px和dp两个值
  • 边框:显示所有View的边界(类似开发者选项中的"显示布局边界"功能)

其他支持的功能

  • 编辑控件长按需要编辑的控件即可弹出编辑窗口,可以修改内外边距大小、宽高、背景色、字体颜色大小等
  • 移动控件长按控件即可拖动
  • Scalpel:解剖刀,会立体显示view,可以直观的查看view的层级关系,拖动屏幕左侧的按钮可以切换角度
  • 网格:显示网格
  • 字体大小:显示所有TextView的大小
  • 字体颜色:显示所有TextView的颜色
  • 外边距:显示所有View的外边距(Margin)的大小(会填充一个背景色)
  • 内边距:显示所有View的内边距(Padding)的大小(会填充一个背景色)
  • 宽高:显示所有View的宽高
  • 图片宽高:显示所有ImageView的宽高
  • 背景色:显示所有设置background的控件的背景色的值
  • 自定义信息
  • View类型:显示所有View的类型
  • 布局树:显示布局树
  • 性能:可以看到当前窗口view的绘制耗时、事件分发耗时、measure耗时、layout耗时、handler耗时等信息
    • 开启后会自动禁用硬件加速,实际绘制时间可能要少一些
    • ListView会在事件分发时调用getView,所以ListView事件分发时间稍微长一些
    • RecyclerView会在view绘制时bindView,所以RecyclerView绘制时间会稍长一些

可配置项

可配置项

  • 层级区间:Fragment名称、外边距、内边距、宽高、字体大小、字体颜色、背景色等功能下,可以通过设置层级区间过滤掉部分view,避免数值相互覆盖
  • 单位:距离默认单位是dp,可以切换为dp、sp、px单位
  • 裁剪绘制范围:若内外边距、宽高、字体颜色等信息不显示,可以关闭 裁剪绘制。开启该功能可以避免可以滚动的控件滚动后导致的信息覆盖问题。

原理

实现过程:

  • 监听window的创建,从而拿到每一个window的根view。
  • 拿到根view(必须是FrameLayout或RelativeLayout)后给根view添加RootContainerViewRootContainerView内部包含了蓝色的靶心view。每个window都有一个专用的RootContainerView
  • 创建各window共用的DashBoardViewDashBoardView是其他各功能view的容器,比如开启取色功能后会把TakeColorView加到DashBoardView中。
  • 双击当前窗口的靶心按钮会在当前窗口激活 SwissArmyKnife,其实是把共用的DashBoardView添加到了当前窗口的RootContainerView中。
  • 每一个功能都是AbsLayer的子类,AbsLayer继承自FrameLayout。当当前窗口的任何一个view需要绘制时都会调用AbsLayeronUiUpdate方法,可以在该方法里绘制相关信息,比如边框,字体颜色等。

自定义功能

可以通过 Config 对 SAK 进行配置或自定义功能。

  1. public class App extends Application {
  2. @Override
  3. public void onCreate() {
  4. super.onCreate();
  5. Config config = new Config.Build(this)
  6. .viewFilter(getViewFilter())
  7. .addLayerView(getLayerView())
  8. .addSizeConverter(getSizeConverter())
  9. .build();
  10. SAK.init(this, config);
  11. }
  12. private ISizeConverter getSizeConverter() {
  13. return new ISizeConverter() {
  14. // 可以添加自定义的SizeConverter,默认提供了Origin*、Px2Dp*,Px2Sp*
  15. @Override
  16. public String desc() {
  17. return "my converter";
  18. }
  19. @Override
  20. public Size convert(Context context, float length) {
  21. return Size.obtain().setLength(length / 2).setUnit("myU");
  22. }
  23. @Override
  24. public int recovery(Context context, float length) {
  25. return 0;
  26. }
  27. };
  28. }
  29. private AbsLayer getLayerView() {
  30. // 可以添加自定义的view,自定义的view要继承自AbsLayer或其子类,AbsLayer是FrameLayout的子类
  31. // 当激活SwissArmyKnife时会调用 onAttached(View rootView)方法,rootView是当前window的根view,比如Activity的根view DecorView。
  32. //当停用是会调用`onDetached`
  33. return new AbsLayer(this) {
  34. @Override
  35. public String description() {
  36. return null;
  37. }
  38. @Override
  39. public Drawable icon() {
  40. return null;
  41. }
  42. };
  43. }
  44. private ViewFilter getViewFilter() {
  45. return new ViewFilter() {
  46. @Override
  47. public boolean apply(View view) {
  48. // 这里可以决定要显示哪种view,比如只显示ImageView子类和LinearLayout子类
  49. // 若想要显示所有可见的view,直接返回 view.getVisibility()==View.VISIBLE 即可
  50. return view instanceof ImageView || view instanceof LinearLayout;
  51. }
  52. };
  53. }
  54. }

2019-6-30

-UI调试工具 SAK 布局 MD的更多相关文章

  1. Android开发1:基本UI界面设计——布局和组件

    前言 啦啦啦~本学期要开始学习Android开发啦~ 博主在开始学习前是完完全全的小白,只有在平时完成老师要求的实验的过程中一步一步学习~从此篇博文起,博主将开始发布Android开发有关的博文,希望 ...

  2. [前端]使用JQuery UI Layout Plug-in布局 - wolfy

    引言 使用JQuery UI Layout Plug-in布局框架实现快速布局,用起来还是挺方便的,稍微研究了一下,就能上手,关于该布局框架的材料,网上也挺多的.在项目中也使用到了,不过那是前端的工作 ...

  3. JQuery UI Layout Plug-in布局

    端]使用JQuery UI Layout Plug-in布局   引言 使用JQuery UI Layout Plug-in布局框架实现快速布局,用起来还是挺方便的,稍微研究了一下,就能上手,关于该布 ...

  4. 关闭VS2015的WPF UI调试工具

    VS菜单: 工具 > 选项 > 调试 > 常规 > 启用Xaml 的UI调试工具.把勾勾去掉.

  5. 【详细】Android入门到放弃篇-YES OR NO-》各种UI组件,布局管理器,单元Activity

    问:达叔,你放弃了吗? 答:不,放弃是不可能的,丢了Android,你会心疼吗?如果别人把你丢掉,你是痛苦呢?还是痛苦呢?~ 引导语 有人说,爱上一个人是痛苦的,有人说,喜欢一个人是幸福的. 人与人之 ...

  6. [前端]使用JQuery UI Layout Plug-in布局

    引言 使用JQuery UI Layout Plug-in布局框架实现快速布局,用起来还是挺方便的,稍微研究了一下,就能上手,关于该布局框架的材料,网上也挺多的.在项目中也使用到了,不过那是前端的工作 ...

  7. HarmonyOS Java UI之DependentLayout布局示例

    DependentLayout简介 DependentLayout意为相对位置布局,与DirectionalLayout相比较有更多的排布方式,每个组件可以指定相对于其他同级组件的位置,也可以指定相对 ...

  8. android免root兼容所有版本ui调试工具

    SwissArmyKnife是什么 SwissArmyKnife 是一款方便调试android UI的工具,可以兼容所有android版本,不需要root权限.可以直接在android手机屏幕上显示当 ...

  9. 第1组UI组件:布局管理器

    1 布局管理的来源 为了让UI在不同的手机屏幕上都能运行良好----不同手机屏幕的分辨率/尺寸并不完全相同,如果让程序手动控制每个组件的大小.位置,会给编程带来巨大的麻烦.为了解决这个问题.andro ...

随机推荐

  1. Windows下Redis安装配置和使用注意事项

    Windows下Redis安装配置和使用注意事项 一:下载 下载地址: https://github.com/microsoftarchive/redis/releases 文件介绍: 本文以3.2. ...

  2. axios get及post方法代码示例&&方法封装

    axios get及post方法代码示例 get方法: show: function(){ //get方式 //赋值给变量self var self = this; var url = "h ...

  3. python语言(六)mock接口开发、发邮件、写日志、新Excel操作

    一.urllib模块 urllib模块是一个标准模块,直接import urllib即可,在python3里面只有urllib模块,在python2里面有urllib模块和urllib2模块. url ...

  4. 12 opencv图像合成

    #include < stdio.h > #include < opencv2\opencv.hpp > #include < opencv2\stitching.hpp ...

  5. PDB files out of the debugger

    我想我不需要强调在调试时拥有有效的PDB文件有多重要.通常,PDB文件是由调试器静默加载的,并且您很高兴在modules窗口中看到解析的所有符号.不幸的是,您还可能遇到调试器找不到匹配符号的情况.其原 ...

  6. restql 学习三 查询语言简单说明

    restql 中with 参数的内容在restql 中实际上就是http request 的请求内容.按照restql 的设计 method 分为 from (get) , to (post) ,in ...

  7. C函数之genv

    函数原型: include<stdlib.h> char *getenv(char *envvar); 函数说明: getenv()用来取得参数envvar环境变量的内容.参数envvar ...

  8. const 变量在多个文件共享,如何验证两种不同的方式下,编译器是否会在多个文件下建立多个副本

    对于const变量多个文件共享,当我们不希望编译器为每个文件分别生成独立的变量,而是像非常量对象一个,一处定义,多处声明并使用. 解决办法是,对于const变量,不管是声明还是定义都添加extern关 ...

  9. js追加html元素

    jquery追加html代码,添加元素 .append() //新增仲裁申请人 $("."+inputName).append("<div class=\" ...

  10. 课后选做题-MyOD

    课后选做题-MyOD od命令的了解 功能 od命令用于将指定文件内容以八进制.十进制.十六进制.浮点格式或ASCII编码字符方式显示,通常用于显示或查看文件中不能直接显示在终端的字符.od命令系统默 ...