android 拦截点击事件,android事件拦截机制 -凯发k8官方网
一直对事件拦截不是很清楚,读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事件拦截机制的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: android实现蝴蝶动画,androi
- 下一篇: linux ora 00119,ora-