onTouch与onClick事件的关系
这几天遇到点关于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 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);
- }
- }
onTouch与onClick事件的关系的更多相关文章
- Android中onTouch与onClick事件的关系
这几天遇到点关于Android的触摸事件相关的,还跟onClick有关.暂且记下: LinearLayout分别设置了onTouchListener,onClickListener,onLongCli ...
- android 关于view的onTouch和onClick同时触发解决方案
extends:http://blog.sina.com.cn/s/blog_aa0bd5950101gbwt.html 做了一个悬浮窗,需要处理onTouch和onClick事件, 1 定义一个bo ...
- Android View的onTouch和onClick和onLongClick事件
这三个事件的调用顺序是: onTouch->onLongClick->onClick 先看这三个事件的处理函数: public boolean onTouch(View v, Motion ...
- Android开发详解之onTouch和onClick详解
android组件中的onTouch,onClick,onLongClick事件发生先后顺序和关联: 一,onTouch返回false 首先是onTouch事件的down事件发生,此时,如果长按,触发 ...
- ListView中的组件Button的OnClick事件触发时机
Android开发时,ListView中的组件Button的OnClick事件必须在ListView之外的组件事件触发后才能触发? 此处ListView无OnItemClick事件,而且ListVie ...
- js事件、Js中的for循环和事件的关系、this
一.js事件 1.事件 用户在网页中所触发的行为 鼠标滑动种类很多,键盘.表单特列: 点击:onclick 鼠标进入:onmouseenter 鼠标离开:onmouseleave 鼠标悬浮:onmo ...
- form 表单onclick事件 禁止表单form提交
最近遇到一次处理form数据的过滤,采用了button的onclick事件来检查,发现return false后表单仍然提交了. 于是仔细研究了下onclick.onsubmit.submit集合函数 ...
- button 按钮,结合onclick事件,验证和提交表单
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- input 的blur事件之后button的onclick事件不执行解决方案
最近发现网页程序中有个BUG,就是在input标签输入框中输入完数据后,直接点击“取消” 按钮的时候.出现网页崩死的情况: 经过小主酸菜我,各种方法的尝试后,找到一个初步可以解决的方案,在这里分享给大 ...
随机推荐
- 【Merge Sorted Array】cpp
题目: Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Not ...
- 用fabric部署维护kle日志收集系统
最近搞了一个logstash kafka elasticsearch kibana 整合部署的日志收集系统.部署参考lagstash + elasticsearch + kibana 3 + kafk ...
- Kafka的coordinator
(基于0.10版本) Group Management Protocol Kafka的coordiantor要做的事情就是group management,就是要对一个团队(或者叫组)的成员进行管理. ...
- Goolg Chrome 插件开发--Hello world
开发Chrome插件很简单,只要会web开发(html+javascript+css)那么这个就是能驾轻就熟,只需要了解一下插件具体的运行环境及要求就OK了. 1.先创建一个html文件,名字随便取, ...
- Unity3d 联通沃商店接入问题
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Loope ...
- Windows Server
1. Windows Server 在试用license过期后会出现2小时一次的关机.如果暂时无法注册或者激活,下面的方法可以试试 taskkill /f /im wlms.exe ping -n 1 ...
- 解决Notice错误,性能竟然提升了1000多倍!
先说PHP的deprecated错误的性能问题 最近刚刚完成了一个项目,在测试完基本功能后,我们就发布到线上.结果上线不久就发现产生了大量的错误,如下图: 一看都是PHP的Deprecated错误,是 ...
- 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 ...
- JS初学的一些易错的知识点
1. false ,0 , "" ,undefined , null 在Boolean 环境下当成 false: null 在数值环境下当成 0: undefined 在数值 ...
- Assembly(c#中简单说明[转]
什么是Assembly(程序集)?Assembly是一个包含来程序的名称,版本号,自我描述,文件关联关系和文件位置等信息的一个集合.在.net框架中通过Assembly类来支持,该类位于System. ...