Android 使用 APO Aspectj 简单处理按钮重复点击

Android 使用 APO Aspectj 简单处理按钮重复点击

APO Aspectj

效果:项目中所有View点击默认 固定时间内再次点击无效 ,有多次点击需求的View可以添加多次点击注释

Aspectj的Gradle插件

--------- 第一步 ---------
1:项目根目录下的build.gradle中,添加依赖:

dependencies {

classpath ‘com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.0’ }

2:app或其他module目录下的build.gradle中,添加:

apply plugin: ‘android-aspectjx’ dependencies {

implementation ‘org.aspectj:aspectjrt:1.8.9’ }

我要的效果是整个项目的点击时间禁止短时间内连击,如果有需要连击的View 我们可以写一个注释达到效果
-------第二步----------(代码来了)

AspectTest控制类

********* 第一个类 AspectTest 整个类 ***********
注意 beforeEnableDoubleClick 方法上面的路径!! 路径 com.xxxxx



>   /**
>      * AspectTest  class
>      */
>     @Aspect
>     public class AspectTest {
>     /**
>      * 全局加注解可双击
>      * canMoreClick  是否接受多次点击
>      * mLastView  用于判断上次点击是不是同一个View
>      */
>     private boolean canMoreClick = false;
>     private View mLastView;
> 
>     /**
>      * 此方法在@MoreClcik 注解的时候会调用
>      * canMoreClick = true;  设置为可重复点击的状态
>      *!!!!----- 注意路径 annotation 是你注释类的地址  -----
>      */  
>     @Before("@annotation(com.example.yangyongli.tool.aop.MoreClcik)")
>    public void beforeEnableDoubleClick(JoinPoint joinPoint) throws Throwable {
>         canMoreClick = true;
>     }
> 
>     /**
>      * 此方法是所有view的OnClicik
>      * 内部判断是否是进行拦截 实现动作
>      *
>      * @param joinPoint
>      * @throws Throwable
>      */
>     @Around("execution(* android.view.View.OnClickListener.onClick(..))  && target(Object) &&
> this(Object)")
>     public void OnClickListener(ProceedingJoinPoint joinPoint) throws Throwable {
>         Object[] objects = joinPoint.getArgs();
>         View view = objects.length == 0 ? null : (View) objects[0];
>         if (view != mLastView) {
>             joinPoint.proceed();//执行
>             MoreClcikUtils.lastClickTime = System.currentTimeMillis();
>         } else {
> 
>             if (canMoreClick) {
>                 joinPoint.proceed();//执行
>                 canMoreClick = false;
>             } else {
>                 if (!MoreClcikUtils.isNextClick()) {
>                     joinPoint.proceed();//在时间间隔外执行
>                 }
>             }
> 
>         }
>         mLastView = view;
>     } }

********* 第二个类 MoreClcikUtils 一个判断时间的工具类 ***********

/**
 *  MoreClcikUtils Class
 */
 public class MoreClcikUtils {

    public static long lastClickTime = 0;
    private static long INTERVAL_TIME = 1000;// 点击控制 间隔时长

    /**
     * 判断是否在间隔中
     */
    public synchronized static boolean isNextClick() {
        long currentTime = System.currentTimeMillis();
        boolean isClick2;
        if (currentTime - lastClickTime >
                INTERVAL_TIME) {
            isClick2 = false;
        } else {
            isClick2 = true;
        }
        lastClickTime = currentTime;
        return isClick2;
    }

}

*可多次点击的注解类
!!!!!注意 AspectTest beforeEnableDoubleClick 的路径是这个
!!!!!注意 AspectTest beforeEnableDoubleClick 的路径是这个
!!!!!注意 AspectTest beforeEnableDoubleClick 的路径是这个

@Retention(RetentionPolicy.CLASS)
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
public @interface MoreClcik {
}

然后就可以使用了 不能用你就看看
!!!!!注意 AspectTest beforeEnableDoubleClick 的路径是这个
在这里插入图片描述

使用 如下图
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值