这几天遇到点关于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

測试代码例如以下:

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;
}
}
}
public class LinearLayoutTest extends LinearLayout{
public LinearLayoutTest(Context context) {
super(context);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.e("test","onTouchEvent,action="+event.getAction());
return super.onTouchEvent(event);
}
}

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

  1. [转]android中OnTouch和OnClick、 imagebutton的src和background有什么区别

    1.OnTouch和OnClick有何区别?   专业回答 1.onClick就传入一个View对象,而 onTouch要传入一个View 对象和 MotionEvent的对象2.onTouch对控件 ...

  2. onTouch与onClick事件的关系

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

  3. Android中三种onClick事件的实现与对比

    方式一:在activity的onCreate()方法中,嵌入如下代码: Button button = (Button)findViewById(R.id.button1); button.setOn ...

  4. Android中四种OnClick事件的写法

    package com.example.dailphone; import android.support.v7.app.ActionBarActivity; import android.suppo ...

  5. Android中onTouch方法的执行过程以及和onClick执行发生冲突的解决办法

    $*********************************************************************************************$ 博主推荐 ...

  6. Jquery 移除 html中绑定的onClick事件

    HTML绑定示例: <button class="edit" onClick="showTurnEdit(this)">编辑</button& ...

  7. select中option的onclick事件失效

    html: <select id="pageSelect"> <option value="1" selected onclick=" ...

  8. android 中的 window,view,activity具体关系

    通过讨论这个问题,我们能够见识到google是对面向对象模式的理解,能够理解android底层的一些调用.这也是一道很常见的面试题. 我们这篇文章就来解决这四个问题: Android  中view的显 ...

  9. android中常用的尺寸单位及其关系

    1 尺寸单位定义 px(pixel,像素):每个px对应屏幕上的一个点 dip或dp(device independent pixels,设备独立像素):一种基于屏幕密度的抽象单位.在每英寸160个点 ...

随机推荐

  1. startActivities的使用

    和startActivity()类似,startActivities也是界面跳转,可是传入的intent是一个数组,也就是说是多个. 如果我传入的是两个intent: I1和I2.则调用startAc ...

  2. 你得学会并且学得会的Socket编程基础知识(续)——Silverlight客户端

    本文将在这个案例的基础上,加入一个特殊场景,利用Silverlight来实现客户端.有的朋友可能会说,其实是一样的吧.请不要急于下结论,有用过Silverlight的朋友都有这种体会,很多在标准.NE ...

  3. Oracle中空值与数字相加问题

    select 10 + 10 + 10 from dual 结果是30,全然没问题. select null + 10 + 10 from dual 结果是空串,但期望的结果是20. select n ...

  4. Windows系统虚拟内存文件和休眠缓存大小优化

    虚拟内存的大小设置 虚拟内存的文件 pagefile.sys 一般在系统盘的根目录下,默认情况下会比较大.下面给出缩小设置方式. 我的电脑(鼠标右键)--属性--高级系统设置--切换到“高级”选项卡- ...

  5. appium+python自动化59-appium命令行参数

    Appium服务器参数 许多Appium 1.5服务器参数已被弃用,以支持--default-capabilities标志. 用法: node . [flags] help 1.cmd端口输入,app ...

  6. 使用 UIFontWDCustomLoader 载入自定义字体

    UIFontWDCustomLoader https://github.com/daktales/UIFontWDCustomLoader You can use UIFontWDCustomLoad ...

  7. C# 模拟网站登陆

    实现此功能首先需要借助一些抓包工具,对相应的网站登陆过程进行分析,此过程根据网站的不同,可能复杂,也可能很简单.常用的抓包工具FF下FireBug和IE下的HttpWatch.这两个工具很强大,以此工 ...

  8. C错误异常处理,异常处理

    预处理器标识#error的目的是什么啊? 指令 用途 # 空指令,无任何效果 #include 包含一个源代码文件 #define 定义宏 #undef 取消已定义的宏 #if 如果给定条件为真,则编 ...

  9. Latex 初学者入门(四)-- 多个作者共享同一个地址

    又给老板改格式,其实感觉大多会议都是模板不同,不同主要在于注释,作者,摘要以及引用文献的不同,上次的那篇讲bib数据库的用法,真是倒腾了一整天,不知道为什么一定要使用这种东西,而且老板貌似对人家的风格 ...

  10. C/C++中内联(inline)函数的优点和缺点

    优点 缺点 1. 内联函数代码被放入符号表中,在使用时进行替换,和宏展开一样,效率很高: 1. 不允许过多的代码,代码过多的话会造成大的内存消耗,最好在5行以内: 2. 编绎器在调用一个内联函数,首先 ...