Android中父View和子view的点击事件处理问题探讨
Android 问题 View 探讨 点击 事件处理 和子 中父
2023-06-13 09:14:44 时间
android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。
一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP
当屏幕中包含一个ViewGroup,而这个ViewGroup又包含一个子view,这个时候android系统如何处理Touch事件呢?到底是ViewGroup来处理Touch事件,还是子view来处理Touch事件呢?我只能很肯定的对你说不一定。呵呵,为什么呢?看看下面我的调查结果你
就明白了。
android系统中的每个View的子类都具有下面三个和TouchEvent处理密切相关的方法:
1)publicbooleandispatchTouchEvent(MotionEventev)这个方法用来分发TouchEvent
2)publicbooleanonInterceptTouchEvent(MotionEventev)这个方法用来拦截TouchEvent
3)publicbooleanonTouchEvent(MotionEventev)这个方法用来处理TouchEvent
当TouchEvent发生时,首先Activity将TouchEvent传递给最顶层的View,
TouchEvent最先到达最顶层view的dispatchTouchEvent,然后由dispatchTouchEvent方法进行分发,
如果dispatchTouchEvent返回true,则交给这个view的onTouchEvent处理,
如果dispatchTouchEvent返回false,则交给这个view的interceptTouchEvent方法来决定是否要拦截这个事件,
如果interceptTouchEvent返回true,也就是拦截掉了,则交给它的onTouchEvent来处理,
如果interceptTouchEvent返回false,那么就传递给子view,由子view的dispatchTouchEvent再来开始这个事件的分发。
如果事件传递到某一层的子view的onTouchEvent上了,这个方法返回了false,那么这个事件会从这个view往上传递,都是onTouchEvent来接收。
而如果传递到最上面的onTouchEvent也返回false的话,这个事件就会“消失”,而且接收不到下一次事件。
复制代码代码如下:
一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP
当屏幕中包含一个ViewGroup,而这个ViewGroup又包含一个子view,这个时候android系统如何处理Touch事件呢?到底是ViewGroup来处理Touch事件,还是子view来处理Touch事件呢?我只能很肯定的对你说不一定。呵呵,为什么呢?看看下面我的调查结果你
就明白了。
android系统中的每个View的子类都具有下面三个和TouchEvent处理密切相关的方法:
1)publicbooleandispatchTouchEvent(MotionEventev)这个方法用来分发TouchEvent
2)publicbooleanonInterceptTouchEvent(MotionEventev)这个方法用来拦截TouchEvent
3)publicbooleanonTouchEvent(MotionEventev)这个方法用来处理TouchEvent
当TouchEvent发生时,首先Activity将TouchEvent传递给最顶层的View,
TouchEvent最先到达最顶层view的dispatchTouchEvent,然后由dispatchTouchEvent方法进行分发,
如果dispatchTouchEvent返回true,则交给这个view的onTouchEvent处理,
如果dispatchTouchEvent返回false,则交给这个view的interceptTouchEvent方法来决定是否要拦截这个事件,
如果interceptTouchEvent返回true,也就是拦截掉了,则交给它的onTouchEvent来处理,
如果interceptTouchEvent返回false,那么就传递给子view,由子view的dispatchTouchEvent再来开始这个事件的分发。
如果事件传递到某一层的子view的onTouchEvent上了,这个方法返回了false,那么这个事件会从这个view往上传递,都是onTouchEvent来接收。
而如果传递到最上面的onTouchEvent也返回false的话,这个事件就会“消失”,而且接收不到下一次事件。
privateLayoutInflaterinflater
publicViewfristView;
publicViewsecondView;
privateMyViewPagermyViewPager;
publicViewPagerAdaptermViewPagerAdapter;
privateList<View>views;
publicGallerymGallery;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
inflater=getLayoutInflater();
fristView=inflater.inflate(R.layout.main1,null);
secondView=inflater.inflate(R.layout.main2,null);
views=newArrayList<View>();
views.add(fristView);
views.add(secondView);
mGallery=(Gallery)fristView.findViewById(R.id.gallery);
mGallery.setAdapter(newImageAdapter(this));
myViewPager=(MyViewPager)findViewById(R.id.pager);
mViewPagerAdapter=newViewPagerAdapter(views);
myViewPager.setAdapter(mViewPagerAdapter);
}
//界面列表
privateList<View>views;
publicViewPagerAdapter(List<View>views){
this.views=views;
}
//销毁arg1位置的界面
@Override
publicvoiddestroyItem(Viewarg0,intarg1,Objectarg2){
((ViewPager)arg0).removeView(views.get(arg1));
}
@Override
publicvoidfinishUpdate(Viewarg0){
//TODOAuto-generatedmethodstub
}
//获得当前界面数
@Override
publicintgetCount(){
if(views!=null)
{
returnviews.size();
}
return0;
}
//初始化arg1位置的界面
@Override
publicObjectinstantiateItem(Viewarg0,intarg1){
((ViewPager)arg0).addView(views.get(arg1),0);
returnviews.get(arg1);
}
//判断是否由对象生成界面
@Override
publicbooleanisViewFromObject(Viewarg0,Objectarg1){
return(arg0==arg1);
}
@Override
publicvoidrestoreState(Parcelablearg0,ClassLoaderarg1){
//TODOAuto-generatedmethodstub
}
@Override
publicParcelablesaveState(){
//TODOAuto-generatedmethodstub
returnnull;
}
@Override
publicvoidstartUpdate(Viewarg0){
//TODOAuto-generatedmethodstub
}
相关文章
- Android SDK下载安装及环境配置[通俗易懂]
- Android ListView禁止滑动
- Android 编译_android线程
- Android修改字体_android设置字体样式
- 黑客使用新版 FurBall Android 恶意软件监视伊朗公民
- Android RIL 调试问题分析 ——系统篇(1)
- 【Android应用开发】EasyDialog 源码解析
- 【Android 安装包优化】Tint 着色器 ( 简介 | 布局文件中的 Tint 着色器基本用法 | 代码中使用 Tint 着色器添加颜色效果 )
- 【Android Gradle 插件】Android Plugin DSL Reference 文档介绍 ( 1.2 ~ 3.4 版本文档地址 | 4.1 ~ 7.1 版本文档地址 )
- 【ijkplayer】编译 Android 版本的 ijkplayer ⑤ ( 执行 init-android-libyuv.sh | 执行 init-android-soundtouch.sh )
- 【错误记录】Android Studio 中 Gradle 面板 Task 不显示问题 ( 菜单栏 / File / Settings / Experimental 取消勾选 Do not bui )
- 【Android UI】Path 测量 PathMeasure ① ( PathMeasure API 简介 | 无参构造函数 | 带参构造函数 | Path 闭合设置 | getLength 函数)
- 【错误记录】Android Studio 集成 ARoute 编译报错 ( 兼容 support 库和 androidx 库 | add ‘tools:replace=“android:appCo )
- Android开发中遇到的问题(二)——新建android工程的时候eclipse没有生成MainActivity和layout布局详解手机开发
- [android] 切换界面的问题详解手机开发
- Android热修复Tinker接入实战详解手机开发
- 想做Android Wear开发?你得先搞明白这四件事
- android开发环境遇到adt无法启动的问题分析及解决方法
- Android动态添加View的问题解决方法
- Android的ImageButton当显示Drawable图片时就不显示文字
- Android中的android:layout_weight使用详解
- android设计模式之单例模式详解
- android开发教程之实现toast工具类
- Android中Activity的生命周期探讨