一个用于监听android事件分发流程的库,两行代码即可在运行时期监听事件的分发流程。
在编写一些复杂的布局时,常常由于事件分发到底是哪个view处理产生困扰,做法通常需要经过以下步骤:
- 自定义一个
View,重写disaptchTouchEvent等方法。 - 添加
log日志。 - 然后替换布局文件。
- 编译,通过控制台查看事件分发流程。
- 继续自定义
View.... 如果没有发现问题,无线循环... - 问题解决,删除之前定义的
View,还原布局文件。
那么有没有这样的一个库,在运行时期可以动态的查看事件分发流程,不需要自定义View,不需要替换布局文件,不需要编写log,不需要每次都重新编译呢,基于这个理念,最终诞生了这个库SimpleTouch。
SimpleTouch能够在运行时期打印所有的事件分发日志,同时提供以每一次手指点击到离开为一个流程,以json格式写入到磁盘,便于反复分析。
对于一次完整的手指点击,事件分发的控制台日志如下
- 监听
View的dispatchTouchEvent,onTouchEvent,onInterceptTouchEvent。 - 运行时期动态打印事件分发流程。
- 每一次完整的事件分发记录以
json的形式写入文件。 - 去重功能,对此相同的
move事件会自动省略。 - 提供
no-op版本,使用时可区分debug和release。 - 提供不同模式显示
在项目的app下的build.gradle中添加依赖
debugApi 'com.spearbothy:simple-touch:1.0.3'
releaseApi 'com.spearbothy:simple-touch-no-op:1.0.3'
在项目的Application的onCreate()中调用初始化方法Touch.inject(this);
Touch.init(this, new Config().setSimple(false));Config对象提供一些配置选项
public class Config {
// 输出的日志以极简模式输出
private boolean isSimple = true;
// 是否延迟打印日志,延迟打印日志会在触摸事件结束之后打印,并且具有去重功能
private boolean isDelay = true;
// 是否保留重复的,默认不保留
private boolean isRepeat = false;
// 是否写入到文件
private boolean isPrint2File = true;
}在Activity的onCreate()的super.onCreate(savedInstanceState);之前调用.
@Override
protected void onCreate(Bundle savedInstanceState) {
Touch.inject(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRootView = (LinearLayout) findViewById(R.id.root);
}编译完成之后,打开app,开始触摸吧!!! 每一次手指离开到触摸请间隔大于1s,目的是对于每次触摸加以区分,暂时没想到合适的判断条件。
- 提供了
no-op版本,该版本中包含有初始化和注入方法的空实现,以达到debug和release使用不同的版本,使release不包含任何注入和初始化逻辑。 - 在注入的时候有点耗时,如果页面过于复杂,会有种页面卡顿的感觉.
在初始化时,可以传入Config添加自定义配置,现提供的配置选项如下:
setSimple:log是否已简单的模式进行输出,每一条log的详细程度。setDelay: 是否延迟打印日志,在控制台打印日志分为两种,一种是边触摸边打印(false),一种是这次完成之后再打印(true)。延迟打印的好处在于,对于一次触摸可能会有多次MOVE事件,延迟打印可以对日志进行去重setRepeat: 是否去重,主要用于延迟打印和输出到文件时。setPrint2File: 是否将此次触摸日志保存到文件中。
对于一次触摸事件,通过logcat显示,会有一种密密麻麻的感觉,不太好展示层次逻辑等。最好的方式其实是生成流程图,但是暂时没有好的想法生成流程图,最终以json的方式输出到文件中。
json具有一定的层次结构,所以在输出时加入了一些对应的结构话,便于展示事件流程。
对于一次手指按下到离开的操作,会有多次以根节点到子节点的方法调用,那么每一次完整的方法调用认为是一次流程,及每一次完整的方法调用可以是指DOWN或者UP或者MOVE等。
每一次完整的方法调用认为是一个对象,多次以一个数组的形式进行组装。
在这个流程图中,calls是一个数组,代表方法的调用,包含当前类的方法以及对应子View的方法。
com.android.support:appcompat-v7com.google.dexmaker:dexmakercom.alibaba:fastjsoncom.noober.background:core
有任何疑问可以通过issue或者以邮件的形式发送到zziamahao@163.com


