SingleClick:

@Retention(AnnotationRetention.RUNTIME)@Target(AnnotationTarget.FUNCTION)annotation class SingleClick(    // 点击间隔时间,毫秒    val value: Long = 500)

SingleClickAspect:

import android.os.SystemClockimport org.aspectj.lang.ProceedingJoinPointimport org.aspectj.lang.annotation.Aroundimport org.aspectj.lang.annotation.Aspectimport org.aspectj.lang.annotation.Pointcutimport org.aspectj.lang.reflect.MethodSignature@Aspectclass SingleClickAspect {    /**     * 定义切点,标记切点为所有被@SingleClick注解的方法     * 注意:这里me.baron.test.annotation.SingleClick需要替换成     * 你自己项目中SingleClick这个类的全路径哦     */    @Pointcut("execution(@你的包名.SingleClick * *(..))")    fun methodAnnotated() { }    /**     * 定义一个切面方法,包裹切点方法     */    @Around("methodAnnotated()")    @Throws(Throwable::class)    fun aroundJoinPoint(joinPoint: ProceedingJoinPoint) {        try {            // 取出方法的注解            val signature = joinPoint.signature as MethodSignature            val method = signature.method            // 检查方法是否有注解            val hasAnnotation = method != null && method.isAnnotationPresent(SingleClick::class.java)            if (hasAnnotation) {                // 计算点击间隔,没有注解默认500,有注解按注解参数来,注解参数为空默认500;                val singleClick = method.getAnnotation(SingleClick::class.java)                val interval = singleClick.value                // 检测间隔时间是否达到预设时间并且线程空闲                if (canClick(interval)) {                    joinPoint.proceed()                }            } else {                joinPoint.proceed()            }        } catch (e: Exception) {            // 出现异常不拦截点击事件            joinPoint.proceed()        }    }    // 判断是否响应点击    private fun canClick(interval: Long): Boolean {        val time = SystemClock.elapsedRealtime()        val timeInterval  = Math.abs(time - mLastClickTime)        if (timeInterval > interval) {            mLastClickTime = time            return true        }        return false    }    companion object {        // 最后一次点击的时间        private var mLastClickTime: Long = 0    }}

build.gradle(项目):

buildscript {    dependencies {        classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.4'    }}

build.gradle(APP):

plugins {    id 'android-aspectjx'}

使用:

<?xml version="1.0" encoding="utf-8"?>    
class MainActivity : AppCompatActivity() {    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_main)    }    @SingleClick(800)    fun onTextClick(view: View) {    }}

更多相关文章

  1. Android之键盘点击事件
  2. android点击系统通知Notification,进入指定的activity
  3. Android之键盘点击事件
  4. Android中对话框的工具类
  5. Android仿WIN8系统磁贴点击下沉倾斜效果
  6. android >ToggleButton(开启/关闭) 控件
  7. Android(安卓)studio的点击事件
  8. Android点击通知栏消息,仅打开App,不跳转到具体Activity
  9. android使用inject需要注意的地方

随机推荐

  1. IMF-1
  2. Android 凸起切换按钮(模仿咸鱼App底部)
  3. Android的Button按钮,ACTION_UP事件不触发
  4. 【android精品源码系列】安卓线上购物商
  5. 人人都能看懂的 6 种限流实现方案!(纯干货
  6. (七)Android中的RadioButton组件
  7. Android 测试基础
  8. Android流畅度优化
  9. goods_detail_back_btn_selector.xml
  10. Android(安卓)ApiDemo 系列解析【View->B