Skip to content
 
 

Latest commit

 

History

38 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation


一个用于监听android事件分发流程的库,两行代码即可在运行时期监听事件的分发流程。

在编写一些复杂的布局时,常常由于事件分发到底是哪个view处理产生困扰,做法通常需要经过以下步骤:

  • 自定义一个View,重写disaptchTouchEvent等方法。
  • 添加log日志。
  • 然后替换布局文件。
  • 编译,通过控制台查看事件分发流程。
  • 继续自定义View .... 如果没有发现问题,无线循环...
  • 问题解决,删除之前定义的View,还原布局文件。

那么有没有这样的一个库,在运行时期可以动态的查看事件分发流程,不需要自定义View,不需要替换布局文件,不需要编写log,不需要每次都重新编译呢,基于这个理念,最终诞生了这个库SimpleTouch

SimpleTouch能够在运行时期打印所有的事件分发日志,同时提供以每一次手指点击到离开为一个流程,以json格式写入到磁盘,便于反复分析。

对于一次完整的手指点击,事件分发的控制台日志如下

支持功能

  • 监听ViewdispatchTouchEventonTouchEventonInterceptTouchEvent
  • 运行时期动态打印事件分发流程。
  • 每一次完整的事件分发记录以json的形式写入文件。
  • 去重功能,对此相同的move事件会自动省略。
  • 提供no-op版本,使用时可区分debugrelease
  • 提供不同模式显示

引入

添加依赖

在项目的app下的build.gradle中添加依赖

debugApi 'com.spearbothy:simple-touch:1.0.3'
releaseApi 'com.spearbothy:simple-touch-no-op:1.0.3'

初始化

在项目的ApplicationonCreate()中调用初始化方法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;
}

注入

ActivityonCreate()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版本,该版本中包含有初始化和注入方法的空实现,以达到debugrelease使用不同的版本,使release不包含任何注入和初始化逻辑。
  • 在注入的时候有点耗时,如果页面过于复杂,会有种页面卡顿的感觉.

功能列表

Config配置说明

在初始化时,可以传入Config添加自定义配置,现提供的配置选项如下:

  • setSimple : log是否已简单的模式进行输出,每一条log的详细程度。
  • setDelay : 是否延迟打印日志,在控制台打印日志分为两种,一种是边触摸边打印(false),一种是这次完成之后再打印(true)。延迟打印的好处在于,对于一次触摸可能会有多次MOVE事件,延迟打印可以对日志进行去重
  • setRepeat : 是否去重,主要用于延迟打印和输出到文件时。
  • setPrint2File : 是否将此次触摸日志保存到文件中。

保存到文件说明

对于一次触摸事件,通过logcat显示,会有一种密密麻麻的感觉,不太好展示层次逻辑等。最好的方式其实是生成流程图,但是暂时没有好的想法生成流程图,最终以json的方式输出到文件中。

json具有一定的层次结构,所以在输出时加入了一些对应的结构话,便于展示事件流程。

对于一次手指按下到离开的操作,会有多次以根节点到子节点的方法调用,那么每一次完整的方法调用认为是一次流程,及每一次完整的方法调用可以是指DOWN或者UP或者MOVE等。

每一次完整的方法调用认为是一个对象,多次以一个数组的形式进行组装。

在这个流程图中,calls是一个数组,代表方法的调用,包含当前类的方法以及对应子View的方法。

引用或借鉴的三方库

  • com.android.support:appcompat-v7
  • com.google.dexmaker:dexmaker
  • com.alibaba:fastjson
  • com.noober.background:core

关于

有任何疑问可以通过issue或者以邮件的形式发送到zziamahao@163.com

About

一个用来监听View事件分发的库

Resources

Stars

1 star

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages