Android Aspectj 簡單實戰(zhàn)

第一步 創(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;
        }
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,673評論 1 32
  • 現(xiàn)在市面上很多框架都有使用到注解,比如butterknife庫、EventBus庫、Retrofit庫等等。...
    tuacy閱讀 5,791評論 1 15
  • 明天散學(xué)典禮,臨時起意和英語老師請教了一下。老師的建議很中肯,要培養(yǎng)小朋友學(xué)英語的興趣,其實母語學(xué)習(xí)本身就給我們很...
    Friz閱讀 169評論 0 0
  • 晚上。 妻子:“明天早上不能給你做飯了。我脖上的包塊明顯變大,醫(yī)生說得盡快查明原因,約好了明天八點到醫(yī)院?!?丈夫...
    學(xué)著忘記閱讀 3,629評論 72 73
  • 這周的計劃依舊是七課時注會,七課時申論+面試,五小時有氧。 計劃都完成了,而且這一周的有氧運動多做了一小時。太羨慕...
    不二五仔閱讀 209評論 0 0

友情鏈接更多精彩內(nèi)容