@Retention(AnnotationRetention.RUNTIME) @Target(AnnotationTarget.FUNCTION) annotation class SingleClick( // 点击间隔时间,毫秒 val value: Long = 500 )
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注解的方法 * 注意:这里 你的包名.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 } }
buildscript { dependencies { classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.4' } }
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_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:onClick="onTextClick" android:layout_width="wrap_content" android:layout_height="wrap_content" 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实现防按钮连点功能的资料请关注小牛知识库其它相关文章!
本文向大家介绍vue实现点击按钮下载文件功能,包括了vue实现点击按钮下载文件功能的使用技巧和注意事项,需要的朋友参考一下 项目中需要用到文件下载功能,查了资料发现需要用到a标签的特性,但是这边需要用到点击按钮下载,懒得写样式,于是用了以下代码. 在el-button的外面套了一层el-link,如下图,可以正常下载 以下是el-link文字链接的属性 总结 以上所述是小编给大家介绍的vue实现点
本文向大家介绍js实现点击按钮复制文本功能,包括了js实现点击按钮复制文本功能的使用技巧和注意事项,需要的朋友参考一下 最近遇到一个需求,需要点击按钮,复制 <p> 标签中的文本到剪切板 之前做过复制输入框的内容,原以为差不多,结果发现根本行不通 尝试了各种办法,最后使了个障眼法,实现了下面的效果 一、原理分析 浏览器提供了 copy 命令 ,可以复制选中的内容 如果是输入框,可以通过 selec
本文向大家介绍BootStrap实现带关闭按钮功能,包括了BootStrap实现带关闭按钮功能的使用技巧和注意事项,需要的朋友参考一下 说明 通过使用一个象征关闭的图标,可以让模态框和警告框消失 示例 输出 以上所述是小编给大家介绍的BootStrap实现带关闭按钮功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊教程网站的支持!
Verity Sense 配有一个按钮,根据使用情况和按下时长具有不同功能。参见下文,了解按钮在不同模式下的功能以及不同颜色 LED 的含义。 按钮功能 打开/关闭传感器 短按按钮可打开传感器。 按住按钮可关闭传感器。 选择训练模式 要选择训练模式,请短按按钮进行切换,直至所需模式旁的 LED 灯亮起。 您可通过短按按钮来查看已锁定的训练模式。侧边的状态 LED 灯在心率模式下亮蓝色,在记录模式下
本文向大家介绍JavaScript实现的select点菜功能示例,包括了JavaScript实现的select点菜功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript实现的select点菜功能。分享给大家供大家参考,具体如下: 运行效果图如下: 更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript窗口操作与技巧汇总》、《JavaSc
本文向大家介绍Android实现按钮拖拽还原功能,包括了Android实现按钮拖拽还原功能的使用技巧和注意事项,需要的朋友参考一下 具体代码如下所示: 代码解释: 图一,是完整代码。按钮可以随意拖拽(X+Y轴),抬手,按钮恢复到初始位置。 图二区域,按此方式可以实现横向拖拽,类似接打电话动画效果,左边接听,右边挂断。 总结 以上所述是小编给大家介绍的Android实现按钮拖拽还原功能,希望对大家有