Giter VIP home page Giter VIP logo

swissarmyknife's Introduction

SwissArmyKnife

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

更新日志

  • Autopilot 版

  • compile 'com.wanjian:sak:0.3.2' 2018-2-8

  • compile 'com.wanjian:sak:0.3.0' 2018-1-16

    •  允许超出边界绘制。 默认不允许
  • compile 'com.wanjian:sak:0.2.0' 2018-1-12

    •  父控件不可见时不绘制子view信息

SwissArmyKnife是什么

SwissArmyKnife 是一款方便调试android UI的工具,可以兼容所有android版本,不需要root权限。可以直接在android手机屏幕上显示当前Activity中所有控件(不支持dialog,popupwindow,想要支持dialog等可以使用autopilot版,连接 https://github.com/android-notes/SwissArmyKnife/tree/autopilot)的边界,内外边距大小,每一个控件大小,图片大小,字体颜色,大小,以及自定义信息。同时可以直接在屏幕上取色,另外还提供了直尺,圆角尺等工具,可以直接测量大小。针对android开发者还提供了布局树查看功能,可以直接在手机屏幕查看当前Activity中所有控件层次信息等。

可以通过滚动层级滚轮来控制只显示某一层级的信息,避免层级覆盖等。

默认不允许超出父控件边界。当父控件和子控件都比较小时,子控件的字体大小等文本信息可能显示不完整,允许超出边界绘制后可以完整显示

可以通过单位选项控制所有长度的单位,支持px,dp,sp

使用方式

android 4.0及以上用户直接在application的onCreate中调用 com.wanjian.sak.SAK.init(Application context) ,其他版本还需要在每一个activity的onResume中调用com.wanjian.sak.SAK.resume(Activity act) ,并在Activity的onPause中调用com.wanjian.sak.SAK.pause(Activity act)

启动app后会在屏幕左上角看到一个 蓝色Logo ,点击即可进入功能界面。

功能界面

image

img

边框选项

开启边框选项后可以在手机屏幕看到所有控件的边界,效果如下

image

内外边距选项

开启后会在屏幕看到如下效果

image

半透明绿色代表内边距,PT表示上边内边距(padding top),PL表示左内边距(padding left),PT表示右内边距(padding right),PB便是下内边距(padding bottom)。

半透明红色代表外边距, ML,MT,MR,MB分别表示左外边距,上外边距,右外边距,下外边距。

单位可以在功能界面控制

宽高选项

开启后会看到控件的宽高,单位可以在功能界面控制

image

图片宽高

image

字体大小

image

字体颜色

16进制,ARGB

image

强制图片宽高

若开启图片宽高选项后看不到图片大小,可以尝试开启强制图片宽高选项。 ps 该选项可能会导致滑动卡顿

自定义信息

自定义信息用于android开发者调试使用,开发者可以为view设置setTag(com.wanjian.sak.SAK.INFO_KEY,Object),设置后并开启自定义信息选项后就可以在控件左上角看到自定义的文本信息了。

比如开发者想要在屏幕上看到TextView中有多少个文字,就可以这样使用textview.setTag(com.wanjian.sak.SAK.INFO_KEY,textview.getText().length()),这样开启自定义信息选项后就可以在TextView上看到文字长度了。

层级信息

可以通过滚动滚轮来控制只显示某一层次区间的信息,比如只想看ListView中子控件的大小,就可以滚动滚轮来控制只显示ListView子控件大小,具体调整成多少需要多次尝试。滚轮可以控件边框,宽高,布局树等等。

直尺圆角尺,取色器

开启后会在屏幕左上角显示,取色器刚开启时只会在屏幕左上角看到一个马赛克方块,拖动到要取色的位置后抬起手机即可完成取色,取色器四个角可以获取所指像素的颜色值。取色器可以获取native页面每个像素颜色,也可以获取webview中每一个像素的颜色。

image

布局树

布局树可以双指缩放

image

允许超出边界绘制

默认不允许超出父控件边界。当父控件和子控件差不多大小时,子控件的字体大小等文本信息可能显示不完整,允许超出边界绘制后可以完整显示

自定义功能

        Config config = new Config.Build(this)
                .viewFilter(new ViewFilter() {
                    @Override
                    public boolean apply(View view) {
                        if (view instanceof ImageView) {
                            return true;
                        }
                        if (view instanceof LinearLayout) {
                            return true;
                        }
                        return false;
                    }
                })
                .addLayerView(new TakeColorView(this))
                .addLayer(new InfoLayer(this))
                .addLayer(new BorderLayer(this))
                .addLayer(new BitmapWidthHeightLayer(this))
                .addLayer(new ViewClassLayer(this))
                .addSizeConverter(new SizeConverter() {
                    @Override
                    public String desc() {
                        return "my converter";
                    }

                    @Override
                    public Size convert(Context context, float length) {
                        return Size.obtain().setLength(length / 2).setUnit("myU");
                    }
                })
                .build();
        SAK.init(this, config);

可以按照如上所示定义自己的ViewFilter,决定要显示哪种view,比如只显示ImageView子类和LinearLayout子类,若想要显示所有可见的view,则直接返回 view.getVisibility()==View.VISIBLE即可。

也可以添加自定义的view和图层,单位转换等。自定义的view要继承自AbsLayerView,自定义图层要继承自AbsLayerLayerAdapterLayerTxtAdapter,区别在于LayerAdapter 的子类可以通过功能界面的层级滚轮进行控制,LayerTxtAdapter 继承自LayerAdapter ,提供了绘制文本的功能。

可以添加多个单位转换SizeConverter,默认提供了原始数值SizeConverter,PX2DP SizeConverter,PX2SP SizeConverter,子定义的SizeConverter需要继承自SizeConverter ,并重写相关方法即可。

然后参考上述初始化SAK即可。

目前SAK提供的Layer如下,默认初始化(SAK.init(Application))会包含如下所有的Layer,通过Config初始化时不会包含任何Layer,可以根据需要添加如下Layer 中的若干个,也可以添加自定义的Layer

  • BackgroundColorLayer
  • BitmapWidthHeightLayer
  • BorderLayer
  • ForceBitmapWidthHeightLayer
  • InfoLayer
  • MarginLayer
  • PaddingLayer
  • PageDrawPerformanceLayer
  • TextColorLayer
  • TextSizeLayer
  • ViewClassLayer
  • ViewDrawPerformanceLayer
  • WidthHeightLayer

原理

获取当前显示的Activity的根布局( ViewGroup root=(ViewGroup) activity.getWindow().getDecorView()),并为其添加蒙层view( root.addView(mCoverView)),遍历view树,把相关信息绘制在蒙层上即可

4.0及以上通过 application.registerActivityLifecycleCallbacks()获取当前显示的Activity。

手动调用view的draw(new Canvas(bmp)),统计该方法的执行时间即可得到渲染时间

工程代码:

https://github.com/android-notes/SwissArmyKnife

swissarmyknife's People

Contributors

android-notes avatar

Watchers

James Cloos avatar James avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.