android防重複點選
阿新 • • 發佈:2018-11-09
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;
}
}
}
到這裡整個邏輯就完成了,趕緊試試吧