Android kotlin使用注解实现防按钮连点功能

Posted 头发还没秃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android kotlin使用注解实现防按钮连点功能相关的知识,希望对你有一定的参考价值。

SingleClick:

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

SingleClickAspect:

import android.os.SystemClock
import org.aspectj.lang.ProceedingJoinPoint
import org.aspectj.lang.annotation.Around
import org.aspectj.lang.annotation.Aspect
import org.aspectj.lang.annotation.Pointcut
import org.aspectj.lang.reflect.MethodSignature

@Aspect
class 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"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    tools:context=".MainActivity">

    <TextView
        android:onClick="onTextClick"
        android:layout_
        android:layout_
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    @SingleClick(800)
    fun onTextClick(view: View) {

    }
}

以上是关于Android kotlin使用注解实现防按钮连点功能的主要内容,如果未能解决你的问题,请参考以下文章

Android 防重复点击(Kotlin 协程实现 和 Handler实现)

Android 防重复点击(Kotlin 协程实现 和 Handler实现)

Kotlin编译时注解,简单实现ButterKnife

API 接口防刷

告别KAPT,使用KSP为Android编译提速

SpringBoot一个注解,实现接口防刷