/DebouncePlugin

Android点击事件防抖动插件

Primary LanguageJavaApache License 2.0Apache-2.0

DebouncePlugin

Android点击事件防抖动插件,主要为了解决项目中以及第三方库中快速点击问题。

1.支持以下功能:

  1. 支持Lambda点击事件
  2. 支持排除指定目录或指定文件,就跟写gitignore一样简单
  3. 支持配置点击事件间隔,即规定时间内,只允许触发一次点击事件
  4. 支持多种类型的点击事件处理。例如:
    • ListView#onItemClick
    • ListView#onItemSelected
    • ExpandableListView#onGroupClick
    • ExpandableListView#onChildClick
    • ...只要你想处理,都支持。
  5. 更详细的日志输出,插件对哪些方法进行Hook,都会输出到控制台

2.如何使用

  1. 在你项目的build.gradle依赖如下:
buildscript {
    ext.kotlin_version = "1.3.72"
    repositories {
        google()
        jcenter()
    }
    dependencies {
        //依赖插件所需的环境
        classpath 'io.github.sy007:debounce-plugin:0.3.0'
    }
}

allprojects {
    repositories {
        //添加mavenCentral仓库
        mavenCentral()
    }
}
  1. 在app module中依赖如下:
apply plugin: 'com.android.application'
//应用插件
apply plugin: 'debounce-plugin'
android{
   ...
}
dependencies {
    //插件所需的依赖库
    implementation 'io.github.sy007:debounce-lib:0.2.0'
}

这样插件就能正常工作了。无任何配置情况下,插件只会对全局所有onClick事件处理(项目,library,第三方jar和arr)。

3.自定义配置

插件支持自定义配置,在你的app#build.gradle配置如下:

debounce {
    isDebug = true
    debounceCheckTime = 1000
    excludes = ["com/example/gradleplugin/excludes/*"]
    methodEntities {
        onItemClick {//随便填写,在methodEntities只要唯一,就像你在写productFlavors
            methodName 'onItemClick'//方法名称
            methodDesc '(Landroid/widget/AdapterView;Landroid/view/View;IJ)V'//方法描述
            interfaceName 'android/widget/AdapterView\$OnItemClickListener' //事件方法所在的接口名
        }
    }
}
  1. isDebug : 为true时会有日志输出

  2. debounceCheckTime:两次点击间隔超过多长时间就认定为非抖动,单位毫秒。

  3. excludes : 排除哪些目录或文件的插桩,类似于.gitignore 编写规则

  4. methodEntities : 需要插桩的方法信息,只有声明在methodEntities中的方法信息才会被插桩。

    注意:插件中默认注册了onClick方法信息,所以如果只是处理View的OnClickListener点击抖动,不需要声明methodEntities并添加方法信息,插件内部会自动处理。

    这里以ListView#onItemClick为例子;当然你可以添加其他类型点击事件,比如ExpandableListView子条目点击事件。

     methodEntities {
         onItemClick {//随便填写,在methodEntities只要唯一,就像你在写productFlavors
             methodName 'onItemClick'//方法名称
             methodDesc '(Landroid/widget/AdapterView;Landroid/view/View;IJ)V'//方法描述
             interfaceName 'android/widget/AdapterView\$OnItemClickListener' //事件方法所在的接口名
         }
     }

4.日志说明

集成完毕后需要同步下,插件会输出如下日志:

╔═══════════════════════════════════════════════════════════════════════════════════════════════════
║                                      Debounce  configInfo
╟───────────────────────────────────────────────────────────────────────────────────────────────────
║{
  "isDebug": true,
  "excludes": [
      "com/example/gradleplugin/excludes/*"
  ],
  "methodEntities": {
      "onItemClick": {
          "methodDesc": "(Landroid/widget/AdapterView;Landroid/view/View;IJ)V",
          "interfaceName": "android/widget/AdapterView$OnItemClickListener",
          "methodName": "onItemClick"
      }
  },
  "debounceCheckTime": 1000
}
╚═══════════════════════════════════════════════════════════════════════════════════════════════════

上面日志的输出说明配置没问题,插件在被应用时会打印外部配置的信息。

在运行apk时,插件会详细输出哪些方法被Hook了,以便开发者明确知道。这里以Demo中的MainActivity为例:

╔═══════════════════════════════════════════════════════════════════════════════════════════════════
║className:com.example.gradleplugin.MainActivity
╟───────────────────────────────────────────────────────────────────────────────────────────────────
║methods:
║  onClick(Landroid/view/View;)Vlambda$onCreate$1(Landroid/view/View;)Vlambda$onCreate$0(Landroid/view/View;)V
╚═══════════════════════════════════════════════════════════════════════════════════════════════════

Demo运行起来后,点击页面上的按钮如图所示:

image

5.注意事项

凡是修改以下结点的任何信息,都需要Build->clean Project,然后在运行项目。否则新修改的配置不会生效。

debounce {
    isDebug = true
    debounceCheckTime = 500
    excludes = ["com/example/gradleplugin/excludes/*"]
    methodEntities {
        onItemClick {
            methodName 'onItemClick'
            methodDesc '(Landroid/widget/AdapterView;Landroid/view/View;IJ)V'
            interfaceName 'android/widget/AdapterView\$OnItemClickListener'
        }
    }
}

如何查看插件修改过后的代码:

查看路径:app\build\intermediates\transforms\DebounceTransform\xxx

6.更新日志

0.3.0

升级debounce-plugin依赖的ASM版本到7.3.1版本

0.2.0

  1. 修复自定义View中运行时点击按钮出现闪退问题
  • 针对子类重写父类的方法时,子类和父类中都插入判断代码
  • 构造函数中创建检测工具类延迟到点击方法被调用时
  1. 调整日志打印

0.1.0

项目初始化