ViewGroup
View
 Activity dispatchTouchEvent


有 onInterceptTouchEvent


无 onTouchEvent


例子零: 只有OnTouch和OnItemClick

        actualListView.setOnTouchListener(new OnTouchListener() {

            @Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "DOWN",
Toast.LENGTH_SHORT).show();
return false; //这儿是true,下面是false,onItemClick会走 case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "UP",
Toast.LENGTH_SHORT).show();
return true; //上面随意,只要这个地方返回true,onItemClick就不会走
}
return false;
}
});
actualListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(MainActivity.this, "setOnClickListener",
Toast.LENGTH_SHORT).show();
} });

例子一:  只有OnTouch和OnItemClick

actualListView.setOnTouchListener(new OnTouchListener() {

            @Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "DOWN",
Toast.LENGTH_SHORT).show();
break; case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "UP",
Toast.LENGTH_SHORT).show();
break;
}
return false; //返回false之后
      }
});
actualListView.setOnItemClickListener(new OnItemClickListener() {       @Override
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
         Toast.makeText(MainActivity.this, "setOnClickListener", Toast.LENGTH_SHORT).show();
      }
});

先走ACTION_DOWN,ACTION_UP,最后走onItemClick。

例子二:只有OnTouch和OnItemClick

actualListView.setOnTouchListener(new OnTouchListener() {

            @Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "DOWN",
Toast.LENGTH_SHORT).show();
break; case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "UP",
Toast.LENGTH_SHORT).show();
break;
}
return true; //返回true之后
      }
});
actualListView.setOnItemClickListener(new OnItemClickListener() {

       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
           Toast.makeText(MainActivity.this, "setOnClickListener", Toast.LENGTH_SHORT).show();
       }
});

先走ACTION_DOWN,ACTION_UP,   onItemClick不走

例子三:只有OnTouch和OnItemClick和dispatchTouchEvent

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "dispatch DOWN",
Toast.LENGTH_SHORT).show();
break; case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "dispatch UP",
Toast.LENGTH_SHORT).show();
break;
} return super.dispatchTouchEvent(ev);
}
actualListView.setOnTouchListener(new OnTouchListener() {

            @Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "DOWN",
Toast.LENGTH_SHORT).show();
break; case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "UP",
Toast.LENGTH_SHORT).show();
break;
}
return false; //返回false之后
      }
});

actualListView.setOnItemClickListener(new OnItemClickListener() { 

      @Override
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
         Toast.makeText(MainActivity.this, "setOnClickListener", Toast.LENGTH_SHORT).show();
      }
});
 

先走dispatchTouchEvent的ACTION_DOWN------------>OnTouch的ACTION_DOWN------------->dispatchTouchEvent的ACTION_UP

----------------->OnTouch的ACTION_UP----------------->onItemClick

例子四:只有OnTouch和OnItemClick和dispatchTouchEvent

    @Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "dispatch DOWN",
Toast.LENGTH_SHORT).show();
break; case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "dispatch UP",
Toast.LENGTH_SHORT).show();
break;
} return super.dispatchTouchEvent(ev);
}
actualListView.setOnTouchListener(new OnTouchListener() {

            @Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "DOWN",
Toast.LENGTH_SHORT).show();
break; case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "UP",
Toast.LENGTH_SHORT).show();
break;
}
return true; //返回true之后
      }
});

actualListView.setOnItemClickListener(new OnItemClickListener() {

       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
           Toast.makeText(MainActivity.this, "setOnClickListener", Toast.LENGTH_SHORT).show();
       }
});
 

先走dispatchTouchEvent的ACTION_DOWN------------>OnTouch的ACTION_DOWN------------->dispatchTouchEvent的ACTION_UP

----------------->OnTouch的ACTION_UP

例子五:只有OnTouch和OnItemClick和dispatchTouchEvent

    @Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "dispatch DOWN",
Toast.LENGTH_SHORT).show();
return true; //这儿无论是true还是false,都会导致OnTouch和OnItemClick不走,因为没有下面的super来分发事件在activity中的操作 case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "dispatch UP",
Toast.LENGTH_SHORT).show();
return true; //这儿无论是true还是false,都会导致OnTouch和OnItemClick不走,因为没有下面的super来分发事件在activity中的操作
    } 
    return super.dispatchTouchEvent(ev);
}
actualListView.setOnTouchListener(new OnTouchListener() {

            @Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "DOWN",
Toast.LENGTH_SHORT).show();
break; case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "UP",
Toast.LENGTH_SHORT).show();
break;
}
return false; //返回false之后
      }
});



actualListView.setOnItemClickListener(new OnItemClickListener() { 

      @Override
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
         Toast.makeText(MainActivity.this, "setOnClickListener", Toast.LENGTH_SHORT).show();
      }
});
 

先走dispatchTouchEvent的ACTION_DOWN---------------------->dispatchTouchEvent的ACTION_UP

例子六:有OnTouch和OnItemClick    和  dispatchTouchEvent和onTouchEvent

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "dispatch DOWN",
Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "dispatch UP",
Toast.LENGTH_SHORT).show();
break;
} return super.dispatchTouchEvent(ev);
} @Override
public boolean onTouchEvent(MotionEvent event) {
Toast.makeText(MainActivity.this, "EveUP",
Toast.LENGTH_SHORT).show();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "Event DOWN",
Toast.LENGTH_SHORT).show();
return true;
case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "Event UP",
Toast.LENGTH_SHORT).show();
return true;
}
return super.onTouchEvent(event);
} Button button = (Button) findViewById(R.id.go_shopping);//这儿改为CLICKABLE的imageview结果一样
button.setOnTouchListener(new OnTouchListener() { @Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "DOWN",
Toast.LENGTH_SHORT).show();
return false; //这儿是true,下面是false,onItemClick会走 case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "UP",
Toast.LENGTH_SHORT).show();
return false; //上面随意,只要这个地方返回true,onItemClick就不会走
}
return false;
}
});
button.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "setOnClickListener",
Toast.LENGTH_SHORT).show();
}
});

先走dispatchTouchEvent的ACTION_DOWN------------>OnTouch的ACTION_DOWN------------->dispatchTouchEvent的ACTION_UP

----------------->OnTouch的ACTION_UP------------>OnClickListener

activity的伪生命周期onTouchEvent没有走,是因为button的onTouchEvent把事件消费了,

 

例子七:有OnTouch和OnItemClick    和  dispatchTouchEvent和onTouchEvent

    @Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "dispatch DOWN",
Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "dispatch UP",
Toast.LENGTH_SHORT).show();
break;
} return super.dispatchTouchEvent(ev);
} @Override
public boolean onTouchEvent(MotionEvent event) {
Toast.makeText(MainActivity.this, "EveUP",
Toast.LENGTH_SHORT).show();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "Event DOWN",
Toast.LENGTH_SHORT).show();
return true;
case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "Event UP",
Toast.LENGTH_SHORT).show();
return true;
}
return super.onTouchEvent(event);
} Button button = (Button) findViewById(R.id.go_shopping); //这儿改为imageview结果一样
button.setOnTouchListener(new OnTouchListener() { @Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "DOWN",
Toast.LENGTH_SHORT).show();
return false; //这儿是true,下面是false,onItemClick会走 case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "UP",
Toast.LENGTH_SHORT).show();
return true; //上面随意,只要这个地方返回true,onItemClick就不会走
}
return false;
}
});
button.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "setOnClickListener",
Toast.LENGTH_SHORT).show();
}
});

先走dispatchTouchEvent的ACTION_DOWN------------>OnTouch的ACTION_DOWN------------->dispatchTouchEvent的ACTION_UP

----------------->OnTouch的ACTION_UP

button的OnClickListener没走,是因为onTouch 在ACTION_UP中返回true,把事件给消费了,导致button的onTouchEvent没走,连带的button的OnClick

也没有走。

activity的伪生命周期onTouchEvent没有走,是因为button的onTouch把事件消费了。

 

例子八:有 dispatchTouchEvent和onTouchEvent

    @Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "dispatch DOWN",
Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "dispatch UP",
Toast.LENGTH_SHORT).show();
break;
} return super.dispatchTouchEvent(ev);
} @Override
public boolean onTouchEvent(MotionEvent event) {
Toast.makeText(MainActivity.this, "EveUP",
Toast.LENGTH_SHORT).show();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(MainActivity.this, "Event DOWN",
Toast.LENGTH_SHORT).show();
return true;
case MotionEvent.ACTION_UP:
Toast.makeText(MainActivity.this, "Event UP",
Toast.LENGTH_SHORT).show();
return true;
}
return super.onTouchEvent(event);
} Button button = (Button) findViewById(R.id.go_shopping);
//不给button设置ontouch和onclick

先走dispatchTouchEvent的ACTION_DOWN----------------->dispatchTouchEvent的ACTION_UP

activity的伪生命周期onTouchEvent没有走,是因为button的dispatchTouchEvent------>onTouchEvent把事件消费了。即使没有ontouch,事件也会被

button给消费掉

viewgroup(listview)和view(button)一样,其onTouchEvent会把事件给消费了,和view(imageview)不一样。

要想activity的伪生命周期onTouchEvent可以走的话,可以把button改为imageview,因为imageview不是“可按的CLICKABLE”,所以会imageview的onTouchEvent会return个false,不会消费掉这个事件

会先走dispatchTouchEvent的ACTION_DOWN------------>onTouchEvent的ACTION_DOWN------------->dispatchTouchEvent的ACTION_UP

----------------->onTouchEvent的ACTION_UP

点击一个ViewGrounp中的Button,事件的传递

Activity的dispatchTouchEvent(返回true或false都会导致事件不会分发,要返回super)----->ViewGrounp的dispatchTouchEvent-------->ViewGrounp的onInterceptTouchEvent()(返回false不拦截)--------->Button的dispatchTouchEvent------------->Button的setOnTouchListener(在up/down时如果返回false)------------->Button的onTouchEvent默认返回true消费事件(imageview默认返回false,事件会向上传/第二个事件的传递看我的另一个文章Android Touch事件传递机制 二)------>Button的setOnClickListener(在onTouchEvent中的up时调用)

Activity的dispatchTouchEvent(返回true或false都会导致事件不会分发,要返回super)----->ViewGrounp的dispatchTouchEvent-------->ViewGrounp的onInterceptTouchEvent()(返回false不拦截)--------->Button的dispatchTouchEvent------------->Button的setOnTouchListener(在up/down时如果返回true)消费事件结束

Activity的dispatchTouchEvent(返回true或false都会导致事件不会分发,要返回super)----->ViewGrounp的dispatchTouchEvent-------->ViewGrounp的onInterceptTouchEvent()(返回false不拦截)--------->Button的dispatchTouchEvent(Button的setOnTouchListener为null)------------->Button的onTouchEvent默认返回true----------->Button的setOnClickListener(在onTouchEvent中的up时调用)

Android Touch事件传递机制 一: OnTouch,OnItemClick(监听器),dispatchTouchEvent(伪生命周期)的更多相关文章

  1. Android Touch事件传递机制 二:单纯的(伪生命周期)

    转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...

  2. Android Touch事件传递机制 二:单纯的(伪生命周期) 这个清楚一点

    转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...

  3. Android Touch事件传递机制引发的血案

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38942135 关于Android Touch事件传递机制我之前也写过两篇文章,自觉得对Tou ...

  4. Android Touch事件传递机制详解 下

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38025165 资源下载:http://download.csdn.net/detail/yu ...

  5. Android Touch事件传递机制具体解释 下

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38025165 资源下载:http://download.csdn.net/detail/yu ...

  6. Android touch 事件传递机制

    前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事 ...

  7. Android Touch事件传递机制通俗讲解

    在讲正题之前我们讲一段有关任务传递的小故事,抛砖迎玉下: 话说一家软件公司,来一个任务,分派给了开发经理去完成: 开发经理拿到,看了一下,感觉好简单,于是 开发经理:分派给了开发组长 开发组长:分派给 ...

  8. Android Touch事件传递机制具体解释 上

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/37961997 近期总是遇到关于Android Touch事件的问题,如:滑动冲突的问题,曾经 ...

  9. Android Touch事件传递机制详解 上

    最近总是遇到关于Android Touch事件的问题,如:滑动冲突的问题,以前也花时间学习过Android Touch事件的传递机制,可以每次用起来的时候总是忘记了,索性自己总结一下写篇文章避免以后忘 ...

随机推荐

  1. File类使用小结

    一.构造函数 File(String pathname):根据参数转换为抽象路径名创建File实例 File(String parent,String filename):根据parent和filen ...

  2. Android仿微信二维码扫描

    转载:http://blog.csdn.net/xiaanming/article/details/10163203 了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一 ...

  3. [emacs] 使用ggtags浏览代码

    [emacs] 使用ggtags浏览代码 // */ // ]]>   [emacs] 使用ggtags浏览代码 Table of Contents 1 相关的连接 2 global简介 2.1 ...

  4. Gobblin编译支持CDH5.4.0

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 Gobblin的前身是linkedin的Camus,好多人也用过,准备用Gobblin的方式来抽 ...

  5. Android之实现ViewPagerIndicator

    PS:最近一直忙于学习任务,一直没有时间去写博客.今天周六,终于有时间了. 学习任务: 1.打造一个自己的ViewPagerIndicator   最近被安排了一大堆的学习任务,感觉老板还是很好的,让 ...

  6. Centos7下修改mysql5.6编码方式 解决网站中文显示问号

    解决办法: 修改MySQL数据库字符编码为UTF-8,UTF-8包含全世界所有国家需要用到的字符,是国际编码. 具体操作: 1.进入MySQL控制台 mysql  -u root -p 输入密码 查看 ...

  7. Python字典实现分析

    背景介绍 最近使用Python开发项目为主,当使用到字典时感觉非常方便实用.那么好奇心就驱使我要搞清楚字典是怎么实现的.为了真正的搞清楚字典的实现就不得不使用C语言来实现一遍,为此我查了一些资料现在总 ...

  8. 写出好的 commit message

    为何要关注提交信息 加快Reviewing Code的过程 帮助我们写好release note 5年后帮你快速想起来某个分支,tag或者 commit增加了什么功能,改变了哪些代码 让其他的开发者在 ...

  9. Effective java笔记(四),泛型

    泛型为集合提供了编译时类型检查. 23.不要在代码中使用原生态类型 声明中具有一个或多个类型参数的类或接口统称为泛型.List<E>是一个参数化类,表示元素类型为E的列表.为了提供兼容性, ...

  10. Devexpress RaisePropertyChanged

    所有的重载设置字段作为参数传递到指定的值,而属性提高INotifyPropertyChanged.PropertyChanged事件. 如果一个字段已经成功地改变,setProperty方法中返回真. ...