zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

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的话,这个事件就会“消失”,而且接收不到下一次事件。
复制代码代码如下:

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
}