1. 程式人生 > >android防重複點選

android防重複點選

android防重複點選

簡介

此方法侵入性小,使用方便,程式碼量少,基於AspectJ實現
先看使用方式

    @SingleClick(2000)
    @Override
    public void onClick(View view) {
    	super.onClick(view)
    }

使用只需要在點選事件上面新增SingleClick(防重複點選時間)註解就好,是不是非常方便!

程式碼實現

1.加入AspectJ外掛
在你工程的build.gradle裡面加入

dependencies {
//noinspection GradleDependency classpath 'com.android.tools.build:gradle:3.0.1' classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.0' }

在你的module的build.gradle加入

apply plugin: 'com.android.application'
apply plugin: 'android-aspectjx'
dependencies {
	implementation 'org.aspectj:aspectjrt:1.8.9'
}

2.單擊事件程式碼
先定義一個註解SingleClick

/**
 * author:  zhouchaoxiang
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SingleClick {
    long value() default 500;//預設的點選間隔時間
}

編寫判斷單擊邏輯程式碼

import android.view.View;
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; import java.lang.reflect.Method; /** * author: zhouchaoxiang */ @Aspect public class SingleClickAspect { /** * 最近一次點選的時間 */ private static long mLastClickTime; /** * 最近一次點選的控制元件ID */ private static int mLastClickViewId; @Pointcut("execution(@SingleClick 的全路徑(如:@com.demo.www.demo.annotation.SingleClick * *(..)))") public void methodAnnotated() {} @Around("methodAnnotated()") public void aroundJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable { // 取出方法的引數 View view = null; for (Object arg : joinPoint.getArgs()) { if (arg instanceof View) { view = (View) arg; break; } } if (view == null) { return; } // 取出方法的註解 MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); Method method = methodSignature.getMethod(); if (!method.isAnnotationPresent(SingleClick.class)) { return; } SingleClick singleClick = method.getAnnotation(SingleClick.class); // 判斷是否快速點選 if (!isFastDoubleClick(view, singleClick.value())) { // 不是快速點選,執行原方法 joinPoint.proceed(); } } /** * 是否是快速點選 * @param v 點選的控制元件 * @param intervalMillis 時間間期(毫秒) * @return true:是,false:不是 */ public boolean isFastDoubleClick(View v, long intervalMillis) { int viewId = v.getId(); long time = System.currentTimeMillis(); long timeInterval = Math.abs(time - mLastClickTime); if (timeInterval < intervalMillis && viewId == mLastClickViewId) { return true; } else { mLastClickTime = time; mLastClickViewId = viewId; return false; } } }

到這裡整個邏輯就完成了,趕緊試試吧