第一步 創(chuàng)建注解
@Retention(RetentionPolicy.RUNTIME) //注解保留至運行時
@Target({ElementType.METHOD,ElementType.CONSTRUCTOR}) //聲明注解作用在方法上面
public @interface SingleClick {
/* 點擊間隔時間 */
long value() default 2000;
}
第二步 創(chuàng)建PointCut
@Aspect
public class SingleClickAspect {
@Pointcut("execution(@com.temp.aaaa.aspectjdemo.SingleClick * *(..))")
public void methodClick() {
}// 該方法不會被執(zhí)行
@Around("methodClick()")
public void around(ProceedingJoinPoint joinPoint) throws Throwable {
/*獲取方法參數(shù)*/
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 (!XClickUtil.isFastDoubleClick(view, singleClick.value())) {
// 不是快速點擊,執(zhí)行原方法
joinPoint.proceed();
}
}
}
第三步 使用
btn_click.setOnClickListener(new View.OnClickListener() {
@SingleClick(5000)
@Override
public void onClick(View v) {
Log.i("ccccccccccc","testFastClick");
}
});
快速點擊工具類
package com.temp.aaaa.aspectjdemo;
import android.os.SystemClock;
import android.view.View;
public final class XClickUtil {
/**
* 最近一次點擊的時間
*/
private static long mLastClickTime;
/**
* 最近一次點擊的控件ID
*/
private static int mLastClickViewId;
/**
* 是否是快速點擊
*
* @param v 點擊的控件
* @param intervalMillis 時間間期(毫秒)
* @return true:是,false:不是
*/
public static boolean isFastDoubleClick(View v, long intervalMillis) {
int viewId = v.getId();
// long time = System.currentTimeMillis();
long time = SystemClock.elapsedRealtime();
long timeInterval = Math.abs(time - mLastClickTime);
if (timeInterval < intervalMillis && viewId == mLastClickViewId) {
return true;
} else {
mLastClickTime = time;
mLastClickViewId = viewId;
return false;
}
}
}