这几天遇到点关于Android的触摸事件相关的,还跟onClick有关,暂且记下:

LinearLayout分别设置了onTouchListener,onClickListener,onLongClickListener及onTouchEvent回调

1、在屏幕上触摸之后基本的执行流程如下:

onTouch,action=0
onTouchEvent,action=0
onTouch,action=2
onTouchEvent,action=2
onTouch,action=2
onTouchEvent,action=2
onTouch,action=1
onTouchEvent,action=1
onClick

也就是先说onTouchListener是最先被触发的,然后是本身的onTouchEvent回调;当最后的up事件发生并被onTouchEvent处理后才会触发onClickListener。

2、把onTouchEvent回调中的super.onTouchEvent去除,直接返回true;则流程如下:

onTouch,action=0
onTouchEvent,action=0
onTouch,action=2
onTouchEvent,action=2
onTouch,action=2
onTouchEvent,action=2
onTouch,action=1
onTouchEvent,action=1

可以看到onClickListener永远无法被触发,也侧面说明了对onClick的触发是在onTouchEvent回调中来实现的。

3、长按屏幕,流程如下:

onTouch,action=0
onTouchEvent,action=0
onTouch,action=2
onTouchEvent,action=2
onTouch,action=2
onTouchEvent,action=2
onLongClick
onTouch,action=2
onTouchEvent,action=2
onTouch,action=2
onTouchEvent,action=2
onTouch,action=1
onTouchEvent,action=1
onClick

当长按的时候,无需到up就会触发onLongClick的响应,但之后也会继续触发onClick的响应。

4、但如果在onLongClick中返回true,则流程如下,即只在中间触发了onLongClick,之后会继续响应touch,但当up的时候就不会再触发onClick

onTouch,action=0

onTouchEvent,action=0
onTouch,action=2
onTouchEvent,action=2
onTouch,action=2
onTouchEvent,action=2
onLongClick
onTouch,action=2
onTouchEvent,action=2
onTouch,action=2
onTouchEvent,action=2
onTouch,action=1
onTouchEvent,action=1

测试代码如下:

  1. public class MainActivity extends Activity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. FrameLayout frame = (FrameLayout)findViewById(R.id.container);
  7. LinearLayoutTest line = new LinearLayoutTest(this);
  8. line.setOnClickListener(new ClickListener());
  9. line.setOnLongClickListener(new LongClickListener());
  10. line.setOnTouchListener(new TouchListener());
  11. line.setLongClickable(true);
  12. frame.addView(line);
  13. }
  14. public class ClickListener implements OnClickListener {
  15. @Override
  16. public void onClick(View v) {
  17. Log.e("test","onClick");
  18. }
  19. }
  20. public class LongClickListener implements OnLongClickListener{
  21. @Override
  22. public boolean onLongClick(View v) {
  23. Log.e("test","onLongClick");
  24. return true;
  25. }
  26. }
  27. public class TouchListener implements OnTouchListener{
  28. @Override
  29. public boolean onTouch(View v, MotionEvent event) {
  30. Log.e("test","onTouch,action="+event.getAction());
  31. return false;
  32. }
  33. }
  34. }
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FrameLayout frame = (FrameLayout)findViewById(R.id.container);
LinearLayoutTest line = new LinearLayoutTest(this);
line.setOnClickListener(new ClickListener());
line.setOnLongClickListener(new LongClickListener());
line.setOnTouchListener(new TouchListener());
line.setLongClickable(true);
frame.addView(line);
}
public class ClickListener implements OnClickListener {
@Override
public void onClick(View v) {
Log.e("test","onClick");
}
}
public class LongClickListener implements OnLongClickListener{
@Override
public boolean onLongClick(View v) {
Log.e("test","onLongClick");
return true;
}
}
public class TouchListener implements OnTouchListener{
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.e("test","onTouch,action="+event.getAction());
return false;
}
}
}

    1. public class LinearLayoutTest extends LinearLayout{
    2. public LinearLayoutTest(Context context) {
    3. super(context);
    4. }
    5. @Override
    6. public boolean onTouchEvent(MotionEvent event) {
    7. Log.e("test","onTouchEvent,action="+event.getAction());
    8. return super.onTouchEvent(event);
    9. }
    10. }
												

onTouch与onClick事件的关系的更多相关文章

  1. Android中onTouch与onClick事件的关系

    这几天遇到点关于Android的触摸事件相关的,还跟onClick有关.暂且记下: LinearLayout分别设置了onTouchListener,onClickListener,onLongCli ...

  2. android 关于view的onTouch和onClick同时触发解决方案

    extends:http://blog.sina.com.cn/s/blog_aa0bd5950101gbwt.html 做了一个悬浮窗,需要处理onTouch和onClick事件, 1 定义一个bo ...

  3. Android View的onTouch和onClick和onLongClick事件

    这三个事件的调用顺序是: onTouch->onLongClick->onClick 先看这三个事件的处理函数: public boolean onTouch(View v, Motion ...

  4. Android开发详解之onTouch和onClick详解

    android组件中的onTouch,onClick,onLongClick事件发生先后顺序和关联: 一,onTouch返回false 首先是onTouch事件的down事件发生,此时,如果长按,触发 ...

  5. ListView中的组件Button的OnClick事件触发时机

    Android开发时,ListView中的组件Button的OnClick事件必须在ListView之外的组件事件触发后才能触发? 此处ListView无OnItemClick事件,而且ListVie ...

  6. js事件、Js中的for循环和事件的关系、this

    一.js事件  1.事件 用户在网页中所触发的行为 鼠标滑动种类很多,键盘.表单特列: 点击:onclick 鼠标进入:onmouseenter 鼠标离开:onmouseleave 鼠标悬浮:onmo ...

  7. form 表单onclick事件 禁止表单form提交

    最近遇到一次处理form数据的过滤,采用了button的onclick事件来检查,发现return false后表单仍然提交了. 于是仔细研究了下onclick.onsubmit.submit集合函数 ...

  8. button 按钮,结合onclick事件,验证和提交表单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. input 的blur事件之后button的onclick事件不执行解决方案

    最近发现网页程序中有个BUG,就是在input标签输入框中输入完数据后,直接点击“取消” 按钮的时候.出现网页崩死的情况: 经过小主酸菜我,各种方法的尝试后,找到一个初步可以解决的方案,在这里分享给大 ...

随机推荐

  1. 【Merge Sorted Array】cpp

    题目: Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Not ...

  2. 用fabric部署维护kle日志收集系统

    最近搞了一个logstash kafka elasticsearch kibana 整合部署的日志收集系统.部署参考lagstash + elasticsearch + kibana 3 + kafk ...

  3. Kafka的coordinator

    (基于0.10版本) Group Management Protocol Kafka的coordiantor要做的事情就是group management,就是要对一个团队(或者叫组)的成员进行管理. ...

  4. Goolg Chrome 插件开发--Hello world

    开发Chrome插件很简单,只要会web开发(html+javascript+css)那么这个就是能驾轻就熟,只需要了解一下插件具体的运行环境及要求就OK了. 1.先创建一个html文件,名字随便取, ...

  5. Unity3d 联通沃商店接入问题

    Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Loope ...

  6. Windows Server

    1. Windows Server 在试用license过期后会出现2小时一次的关机.如果暂时无法注册或者激活,下面的方法可以试试 taskkill /f /im wlms.exe ping -n 1 ...

  7. 解决Notice错误,性能竟然提升了1000多倍!

    先说PHP的deprecated错误的性能问题 最近刚刚完成了一个项目,在测试完基本功能后,我们就发布到线上.结果上线不久就发现产生了大量的错误,如下图: 一看都是PHP的Deprecated错误,是 ...

  8. Find the smallest number whose digits multiply to a given number n

    Given a number ‘n’, find the smallest number ‘p’ such that if we multiply all digits of ‘p’, we get ...

  9. JS初学的一些易错的知识点

    1.  false ,0 , "" ,undefined , null  在Boolean 环境下当成 false: null  在数值环境下当成 0: undefined 在数值 ...

  10. Assembly(c#中简单说明[转]

    什么是Assembly(程序集)?Assembly是一个包含来程序的名称,版本号,自我描述,文件关联关系和文件位置等信息的一个集合.在.net框架中通过Assembly类来支持,该类位于System. ...