导航:首页 > 操作系统 > android拦截点击事件

android拦截点击事件

发布时间:2023-03-16 18:51:24

‘壹’ android中 使用AOP避免重复点击事件

```javascript

```

``` javascript

//上次点击的时间

private static Long sLastclick =0L;

//拦截所有两次点击时间间隔小于一秒的点击事件

private static final Long FILTER_TIMEM =1000L;

//上次点击事件View

private View lastView;

//---- add content -----

//是否过滤点击 默兄掘昌认是

private boolean checkClick =true;

//---- add content -----

@Around("execution(* android.view.View.OnClickListener.onClick(..))")

public void onClickLitener(ProceedingJoinPoint proceedingJoinPoint)throws Throwable {

//大于指定时间

    if (System.currentTimeMillis() -sLastclick >羡扒=FILTER_TIMEM) {

        doClick(proceedingJoinPoint);

    }else {

    //---- update content -----  判断是否需要过滤点击

        //小于指定秒数 但是不是同一个view 可以点击  或者不过滤点击

        if (!checkClick ||lastView ==null ||lastView != (proceedingJoinPoint).getArgs()[0]) {

//---- update content -----  判断是否需要过滤点击

            doClick(proceedingJoinPoint);

        }else {

//大于指定秒数 且是同一个view

            LogUtils.e(TAG,"重复点击,已过滤");

        }

    }

}

//执行原有的 onClick 方法

private void doClick(ProceedingJoinPoint joinPoint)throws Throwable {

//判断 view 是否存在

    if (joinPoint.getArgs().length ==0) {

        joinPoint.proceed();

        return;

}

//记录点击的view

    lastView = (View) (joinPoint).getArgs()[0];

//---- add content -----

    //修改默认过滤点击

    checkClick =true;

//---- add content -----

    //记录点击散粗事件

    sLastclick =System.currentTimeMillis();

//执行点击事件

    try {

        joinPoint.proceed();

    }catch (Throwable throwable) {

        throwable.printStackTrace();

    }

}

@Before("execution(@包名.RepeatClick  * *(..))")

public void beforeEnableDoubleClcik(JoinPoint joinPoint)throws Throwable {

    checkClick =false;

}

```

‘贰’ Android-View的事件分发及拦截-父控件和子控件都处理触摸事件的方式

比如接着上篇 Android-View的事件分发及拦截机制简单流程先体验再研究(场景?疑问? 具体?待续...) ,小白现在要实现就是子View和父ViewGroup都响应点击事件。

1. 单纯的都只是响应down事件

这个就很简单了 - 直接子View的**public boolean **onTouchEvent(MotionEvent event) 里面直接返回false就行了。也就是子控件响应了一次down后,接下来就交给父ViewGroup了.(子View就啥几把也干不了了);

2. 响应down和up事件,move啥的

我们知道子View如果onTouch里面返回了true,那么将会处理后续的move,up事件。而不再交给上层父ViewGroup。那父ViewGroup就没办法在Touch里面处理,所以我们只能放到dispatchTouchEvent或者onInterceptTouchEvent中处理这个down,up等事件:

比如dispatchTouchEvent中:

这样的情况就是父ViewGroup先执行点击事件,然后子View再执行。 如果您蚂掘罩需要父ViewGroup晚点,可以延时执行啥的。

如果此时,子View的dispatchTouchEvent返回true - 表示拦截,不继续了

那么子View的所有的事件都不会响应了。其实也就是散旁我闷闹们的一个事件先传递,touch再处理的树形图:

网络上拔个图来

简单记录下下而已,继续加深理解...这是上一篇的续,还是上一篇....啧啧....后面是官方文档分析来着...

‘叁’ 如何在Android应用里屏蔽鼠标点击事件

这个应该跟你的条码枪有关吧 你试试 不让edittext获取焦点 或者 在触屏事件加个拦截 我只是猜测!

‘肆’ Android点击事件和滑动冲突解决

对于一个根ViewGroup来说,发生点击事件首先调用dispatchTouchEvent
如果这个ViewGroup的onIterceptTouchEvent返回true就表示它要拦截当前事件,接着这个ViewGroup的onTouchEvent就会被调用.如果onIterceptTouchEvent返回false,那么就会继续向下调用子View的dispatchTouchEvent方法,其实整体来说就是个责任链的模式,一层一层的进行分发,当某一层能处理的时候,事件消费结束,当任何一层都不处理的时候,事件返回到最上层。

当一个View需要处理事羡饥件的时候,如果它没有设置onTouchListener,那么直接调用onTouchEvent.如果设置了Listenter 那么就要看Listener的onTouch方法返回值.为true就不调,为false就调onTouchEvent。onTouchListener中的onTouch方法每次都会先于view本身的onTouchEvent调用,且有优先消费权

View的默认实现会在onTouchEvent里面把touch事件解析成Click之类的事件

点击事件传递顺序 Activity -> Window -> View

一旦一个元素拦截了某事件,那么一个事件序列里面后续的Move,Down事件都会交嫌清给它处理.并且它的onInterceptTouchEvent不会再调用

View的onTouchEvent默认都会消耗事件,除非它的clickable和longClickable都是false(不可点击),但是enable属性不会影响

外部调用一般是在外部的onInterceptTouchEvent的方法里,一般也是在move里判断具体的滑动是否需要拦截,如果符合我们外部控件的需求则返回true拦截,如果不符合则返回false不拦截,传递给子控件。两种方式其实原理都是一样就是在move里去根据x和y的一个滑动距离来判断具体将这次兄者返滑动事件交给谁去处理。

阅读全文

与android拦截点击事件相关的资料

热点内容
python编译器怎么清除 浏览:73
linux全局socks代理 浏览:611
php微信抽奖 浏览:771
压缩算法嵌入式移植 浏览:531
php新手小例子 浏览:233
按照医生的算法一周是几天 浏览:805
三次b样条曲线算法 浏览:924
java7特性 浏览:555
爱山东app小学报名怎么知道报没报上 浏览:458
android获取wifi信号 浏览:133
娜拉美妆app怎么使用 浏览:760
有了源码要买服务器吗 浏览:365
app怎么查看自己的存款利息 浏览:515
碧蓝安卓与b站有什么区别 浏览:342
php静态块 浏览:719
ftpmget命令 浏览:475
源码时代怎样 浏览:415
编译aptget 浏览:102
打开防火墙的命令 浏览:161
c混淆编译如何序列化 浏览:808