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

    FMXUI GITHUB: https://github.com/yangyxd/FMXUI FMXUI (YangYxd) [简介] FMXUI的开发忠旨是发掘FMX界面设计的优点,再整合进入And ...

  2. rman多通道全备份脚本

     run{ allocate channel d1 type disk; allocate channel d2 type disk; allocate channel d3 type disk; ...

  3. 构建一个高可扩展性javabean和jsp连接数据库操作

    1. 我们先在Tomcat 中创建一个DataSource- jdbc/Panabia,然后再创建一个java“基类”,这个类封装了数据库连接和连接的释放. package Panabia.db; i ...

  4. 仿LOL项目开发第九天

    仿LOL项目开发第九天 by 草帽 OK,今天我们完全换了一种风格,抛弃了Unity3d的c#语法,我们来写写java的项目. 说到java服务器,当然有些人可能鄙视java的服务器速度太慢,但是相对 ...

  5. [Android Pro] Android源码编译之Nexus5真机编译

    reference to : http://blog.csdn.net/liu1075538266/article/details/51272398 1.   前言 在Android安全的研究工作中, ...

  6. JBoss Data Grid 7.2 在OpenShift环境中的Quick Start

    为了在容器环境中运行,首先需要弄清楚的是在传统环境下如何运行,所以我们从传统环境开始. 先去http://access.redhat.com下载相应介质,主要是 jboss-datagrid-7.2. ...

  7. MIR Flickr 1M 图像数据集(点击即可下载)

    Index of /mirflickr/mirflickr1m Name Last modified Size Description Parent Directory   -   exif.zip ...

  8. 怎样通过terminal得到AWS EC2 instance的ip

    可得到private ip,也是本地的ip.事实上通过ifconfig也能得到: GET http://169.254.169.254/latest/meta-data/local-ipv4 公共ip ...

  9. Java输入输出处理技术1

    1.保存用户输入到文件 从键盘读入一行字符,写到文件output.txt中去. package io; import java.io.*; public class MyFileOutput { pu ...

  10. Python并发编程-Memcached (分布式内存对象缓存系统)

    一.Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的 ...