欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 运维知识 > android >内容正文

android

android 拦截点击事件,android事件拦截机制 -凯发k8官方网

发布时间:2024/10/14 android 37 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 android 拦截点击事件,android事件拦截机制 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

一直对事件拦截不是很清楚,读android群英传的笔记,记录下。

要了解事件拦截,首先要了解触摸事件,触摸事件是捕获触摸屏幕后发生的事件。按一下屏幕通常会有几个事件发生,当按下屏幕,这是事件1。滑动了一下,这是事件2。当手抬起,这是事件3。当重写ontouchevent方法时,会给我们一个事件封装类motionevent。滑动,按下,对应不同的action(如motionevent.action_down,motionevent.action_up),通过对action的判断就可以实现不同的逻辑了。

咋一看触摸事件好像比较简单,但android的view是树形结构的,一个view可能放在一个viewgroup里面,而一个viewgrop可能又放在另一个viewgroup里面,可能会存在多层的嵌套结构,那么里面的触摸事件要给谁处理呢?这就要用到事件拦截了。

先附上代码。

myviewgroupa.java

public class myviewgroupa extends linearlayout {

public myviewgroupa(context context) {

super(context);

}

public myviewgroupa(context context, attributeset attrs) {

super(context, attrs);

}

public myviewgroupa(context context, attributeset attrs,

int defstyleattr) {

super(context, attrs, defstyleattr);

}

@override

public boolean dispatchtouchevent(motionevent ev) {

log.d("log", "viewgroupa dispatchtouchevent" ev.getaction());

return super.dispatchtouchevent(ev);

}

@override

public boolean onintercepttouchevent(motionevent ev) {

log.d("log", "viewgroupa onintercepttouchevent" ev.getaction());

return super.onintercepttouchevent(ev);

}

@override

public boolean ontouchevent(motionevent event) {

log.d("log", "viewgroupa ontouchevent" event.getaction());

return super.ontouchevent(event);

}

}

myviewgroupb.java

public class myviewgroupb extends linearlayout {

public myviewgroupb(context context) {

super(context);

}

public myviewgroupb(context context, attributeset attrs) {

super(context, attrs);

}

public myviewgroupb(context context, attributeset attrs,

int defstyleattr) {

super(context, attrs, defstyleattr);

}

@override

public boolean dispatchtouchevent(motionevent ev) {

log.d("log", "viewgroupb dispatchtouchevent" ev.getaction());

return super.dispatchtouchevent(ev);

}

@override

public boolean onintercepttouchevent(motionevent ev) {

log.d("log", "viewgroupb onintercepttouchevent" ev.getaction());

return super.onintercepttouchevent(ev);

}

@override

public boolean ontouchevent(motionevent event) {

log.d("log", "viewgroupb ontouchevent" event.getaction());

return super.ontouchevent(event);

}

}

myview.java

public class myviewc extends view {

public myviewc(context context) {

super(context);

}

public myviewc(context context, attributeset attrs) {

super(context, attrs);

}

public myviewc(context context, attributeset attrs,

int defstyleattr) {

super(context, attrs, defstyleattr);

}

@override

public boolean ontouchevent(motionevent event) {

log.d("log", "view ontouchevent" event.getaction());

return super.ontouchevent(event);

}

@override

public boolean dispatchtouchevent(motionevent event) {

log.d("log", "view dispatchtouchevent" event.getaction());

return super.dispatchtouchevent(event);

}

}

activity_main.xml

xmlns:app="http://schemas.android.com/apk/res-auto"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@android:color/holo_blue_bright">

android:layout_width="300dp"

android:layout_height="300dp"

android:background="@android:color/holo_green_dark">

android:layout_width="150dp"

android:layout_height="150dp"

android:background="@android:color/darker_gray" />

这里有2个viewgroup,一个view,结构如下

paste_image.png

可以看到myviewgroupa,在最外层,myviewgroupb在中间,myviewc在最底层。

viewgroup分别重写了dispatchtouchevent,onintercepttouchevent,ontouchevent

view重写了ontouchevent,dispatchtouchevent

可以看到viewgroup比view多了一个方法,看名字是拦截的意思。

当我们点击myviewc打印log如下

paste_image.png

可以看到事件的传递顺序是viewgroupa -> viewgroupb - > myview

事件的处理顺序是myview - > viewgroupb - >viewgroupa

android对dispatchtouchevent 的解释如下

/**

* pass the touch screen motion event down to the target view, or this

* view if it is the target.

*

* @param event the motion event to be dispatched.

* @return true if the event was handled by the view, false otherwise.

**/

dispatchtouchevent 方法用来传递事件,返回true ,拦截,返回值false不拦截,继续传递。

ontouchevent也类似,返回true处理,返回false交给上级处理。

可以知道无论是dispatchtouchevent还是 ontouchevent,如果返回true,表示这个事件被消费了、处理了不再往下传。

为了了解拦截过程,先忽略dispatchtouchevent与ontouchevent方法,简单修改viewgroupb onintercepttouchevent为true,同样点击myviewc,log如下

paste_image.png

可以看到viewgroupb拦截后,果然myview就没有事件继续传递了,事件被viewgroupb自己完成。

总结

以上是凯发k8官方网为你收集整理的android 拦截点击事件,android事件拦截机制的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

网站地图