这篇文章主要介绍了Android中点击事件分发机制的原理分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android中点击事件分发机制的原理分析文章都会有所收获,下面我们一起来看看吧。
搭建最简单的结构
新建Activity,重写dispatchTouchEvent和onTouchEvent,前面的方法负责点击事件的分发,后面的方法负责点击事件的消耗,然后打印三种触摸事件的触发
private static final String TAG = MainActivity.class.getSimpleName();
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
Log.d(TAG, "Activity onTouchEvent ACTION_DOWN");//按下
break;
case MotionEvent.ACTION_MOVE:
Log.d(TAG, "Activity onTouchEvent ACTION_MOVE");//移动
break;
case MotionEvent.ACTION_UP:
Log.d(TAG, "Activity onTouchEvent ACTION_UP");//抬起
break;
}
return super.onTouchEvent(event);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
Log.d(TAG, "Activity dispatchTouchEvent ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.d(TAG, "Activity dispatchTouchEvent ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.d(TAG, "Activity dispatchTouchEvent ACTION_UP");
break;
}
return super.dispatchTouchEvent(ev);
}
新建一个类继承自LinearLayout,同样也重写dispatchTouchEvent和onTouchEvent,还有因为LinearLayout继承自ViewGroup,ViewGroup是可以拦截点击事件的,这个很好理解,因为控件都是放在他里面的嘛。所以还要重写onInterceptTouchEvent方法
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
Log.d(TAG, "onInterceptTouchEvent ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.d(TAG, "onInterceptTouchEvent ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.d(TAG, "onInterceptTouchEvent ACTION_UP");
break;
default:
break;
}
return false;
}
(这里有个重点).
这里有个需要注意的地方就是Android的控件有些是默认可以点击的(如Button),还有一些是默认不可点击的(如TextView)他们的分发是有一些不同的,这里我们先看不可点击的,新建一个类继承android.support.v7.widget.AppCompatTextView,兼容的TextView,同时跟Activity一样重写dispatchTouchEvent和onTouchEvent,代码不贴了,跟上面一样,它是普通控件,没有拦截的方法。
开始点击,移动手指后抬起
然后来点一点屏幕上的控件看看打印的log,dispatchTouchEvent和onTouchEvent都返回默认的实现super,onInterceptTouchEvent默认返回false,表示不拦截,默认的情况打印:
1.--------------------------------------
D/MainActivity: Activity dispatchTouchEvent ACTION_DOWN
D/MyLayout: dispatchTouchEvent ACTION_DOWN
D/MyLayout: onInterceptTouchEvent ACTION_DOWN
D/MyTextView: dispatchTouchEvent ACTION_DOWN
2.--------------------------------------
D/MyTextView: onTouchEvent ACTION_DOWN
D/MyLayout: onTouchEvent ACTION_DOWN
D/MainActivity: Activity onTouchEvent ACTION_DOWN
3.--------------------------------------
D/MainActivity: Activity dispatchTouchEvent ACTION_MOVE
D/MainActivity: Activity onTouchEvent ACTION_MOVE
D/MainActivity: Activity dispatchTouchEvent ACTION_MOVE
D/MainActivity: Activity onTouchEvent ACTION_MOVE
D/MainActivity: Activity dispatchTouchEvent ACTION_UP
D/MainActivity: Activity onTouchEvent ACTION_UP
这是默认的情况,把它分为三个阶段:
1. 事件的分发,从上到下,从Activity到Layout到Text的dispatchTouchEvent结束
2. 事件的消耗,从下到上,从Text到Layout到Activity的onTouchEvent结束
3. 这套动作的后续事件交给上个事件的最后消耗者,不经过其他控件的分发
三个函数的其他返回值
dispatchTouchEvent和onTouchEvent都有三种返回情况
- true
- false
- super.dispatchTouchEvent(ev)和super.onTouchEvent(event)
onInterceptTouchEvent有两种返回,true和false,这样来看, 组合起来真是情况太多了,写下来挨个分析看代码的话怕是要看晕,所以这里用一张图来看看所有的情况:
普通不可点击View的事件分发流程
默认可点击控件的事件分发
比如Button这种默认可以点击的控件,或者设置android:clickable=”true”的控件,在分发流程中有一些不同,主要是onTouchEvent的默认方法不同,它直接消耗点击事件,不再往上传递。
可点击View的事件分发流程
关于“Android中点击事件分发机制的原理分析”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Android中点击事件分发机制的原理分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://www.xuebuyuan.com/3288008.html