首页 > 系统 > Android > 正文

Android中父View和子view的点击事件处理问题探讨

2019-10-24 21:06:01
字体:
来源:转载
供稿:网友
当屏幕中包含一个ViewGroup,而这个ViewGroup又包含一个子view,这个时候android系统如何处理Touch事件呢,接下来将对此问题进行深入了解,感兴趣的朋友可以了解参考下,或许对你有所帮助
 
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)public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来分发TouchEvent 
2)public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent 
3)public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理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 的话,这个事件就会“消失”,而且接收不到下一次事件。 
复制代码代码如下:

private LayoutInflater inflater 
public View fristView; 
public View secondView; 
private MyViewPager myViewPager; 
public ViewPagerAdapter mViewPagerAdapter; 
private List<View> views; 
public Gallery mGallery; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 
inflater = getLayoutInflater(); 
fristView = inflater.inflate(R.layout.main1, null); 
secondView = inflater.inflate(R.layout.main2, null); 
views = new ArrayList<View>(); 
views.add(fristView); 
views.add(secondView); 
mGallery = (Gallery) fristView.findViewById(R.id.gallery); 
mGallery.setAdapter(new ImageAdapter(this)); 
myViewPager = (MyViewPager) findViewById(R.id.pager); 
mViewPagerAdapter = new ViewPagerAdapter(views); 
myViewPager.setAdapter(mViewPagerAdapter); 

//界面列表 
private List<View> views; 
public ViewPagerAdapter (List<View> views){ 
this.views = views; 

//销毁arg1位置的界面 
@Override 
public void destroyItem(View arg0, int arg1, Object arg2) { 
((ViewPager) arg0).removeView(views.get(arg1)); 

@Override 
public void finishUpdate(View arg0) { 
// TODO Auto-generated method stub 

//获得当前界面数 
@Override 
public int getCount() { 
if (views != null) 

return views.size(); 

return 0; 

//初始化arg1位置的界面 
@Override 
public Object instantiateItem(View arg0, int arg1) { 
((ViewPager) arg0).addView(views.get(arg1), 0); 
return views.get(arg1); 

//判断是否由对象生成界面 
@Override 
public boolean isViewFromObject(View arg0, Object arg1) { 
return (arg0 == arg1); 

@Override 
public void restoreState(Parcelable arg0, ClassLoader arg1) { 
// TODO Auto-generated method stub 

@Override 
public Parcelable saveState() { 
// TODO Auto-generated method stub 
return null; 

@Override 
public void startUpdate(View arg0) { 
// TODO Auto-generated method stub 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表