onTouchListener与onClickListener

本文详细探讨了Android中OnTouchListener与OnClickListener及OnLongClickListener之间的事件处理逻辑与相互关系,通过实例验证了不同触摸事件的触发条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

版权声明:本文为转载 https://blog.youkuaiyun.com/u011647962/article/details/41212261

仅做自己收藏用,如需要请移步原文(上述链接)阅读。PS:感谢作者

 

package com.example.testlistener;  
  
import android.os.Bundle;  
import android.app.Activity;  
import android.util.Log;  
import android.view.MotionEvent;  
import android.view.View;  
import android.widget.Button;  
  
public class MainActivity extends Activity {  
      
    private static final String TAG="MainActivity";  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
          
        Button button=(Button)findViewById(R.id.button);  
          
        button.setOnTouchListener(new View.OnTouchListener() {  
            public boolean onTouch(View arg0, MotionEvent arg1) {  
                if(arg1.getAction()==MotionEvent.ACTION_DOWN){  
                    Log.i(TAG, "OnTouchListener    +    down");  
                    return false;  
                }else if(arg1.getAction()==MotionEvent.ACTION_UP){  
                    Log.i(TAG, "OnTouchListener    +    up");  
                    return false;  
                }else {  
                    Log.i(TAG, "OnTouchListener    +    move");  
                    return false;  
                }  
            }  
        });  
  
        button.setOnClickListener(new View.OnClickListener() {  
            public void onClick(View arg0) {  
                Log.i(TAG, "OnClickListener");  
            }  
        });  
          
        button.setOnLongClickListener(new View.OnLongClickListener() {  
            public boolean onLongClick(View arg0) {  
                Log.i(TAG, "OnLongClickListener");  
                return false;  
            }  
        });  
    }  
}  

在OnTouchListener事件里有MotionEvent.ACTION_DOWN,MotionEvent.ACTION_UP和MotionEvent.ACTION_MOVE三个事件,我们在这里只讨论MotionEvent.ACTION_DOWN,MotionEvent.ACTION_UP,与MOVE无关。在下面的文章中我们简称MotionEvent.ACTION_DOWN为TouchDown,简称MotionEvent.ACTION_UP为TouchUp。我们还知道Android有消化事件这个概念,在setOnTouchListener函数中如果是TouchDown我们返回true,在下文中我们称消化了TouchDown,返回false则没消化,TouchUp同理。

下面我们说明关系和证明(在用程序证明时每次运行都以 程序----操作----结果的顺序给出)。

1)OnTouchListener和OnClickListener的关系

关系:产生OnClick事件的条件(充要条件)是;TouchDown和TouchUp事件都没有被消化。事件处理的过程是:先处理TouchDown,之后处理TouchUp,如果这两个事件都没被消化,则处理OnClick事件。

程序结果:由于这个关系比较简单就不上图了。程序分4种情况分别为:

a)程序:消化TouchDown,不消化TouchUp------操作:单击按钮------结果:不产生OnClick事件

 

b)程序:不消化TouchDown,消化TouchUp------操作:单击按钮------结果:不产生OnClick事件

c)程序:消化TouchDown,消化TouchUp------操作:单击按钮------结果:不产生OnClick事件

d)程序:不消化TouchDown,不消化TouchUp----操作:单击按钮----结果:产生OnClick事件

2)OnTouchListener和OnLongClickListener的关系

关系:产生OnLongClick事件的条件(充要条件)是;在产生TouchDown事件,并且该TouchDown没有被消化,之后500毫秒内没有响应到TouchUp,则产生OnLongClick事件。

程序结果:对运行情况按TouchDown是否被消化,TouchUp是否被消化,我的操作是长按还是短按可以分为8种运行情况,在这里就不一一列举了,按我们的需要进行分类列举。

a)如果消化TouchDown,按照前面给出的关系,则不可能产生OnLongClick事件。事实是同过我的测试,在这个条件下我对TouchUp是否被消化和操作是长按还是短按4种情况都进行测试,结果都是不产生OnLongClick事件。

b)不消化TouchDown,下面对TouchUp是否被消化又分为两种情况:

bx)不消化TouchDown,不消化TouchUp,对长按和短按分别测试,根据前面给出的关系我们可以推断出长按产生OnLongClick,短按不产生OnLongClick

bx1)程序:不消化TouchDown,不消化TouchUp,----操作:短时间单击按钮----结果:不产生OnLongClick事件

bx2)程序:不消化TouchDown,不消化TouchUp,----操作:长时间单击按钮----结果:产生OnLongClick事件

测试结果满足我们的推断。

by)不消化TouchDown,消化TouchUp,对长按和短按分别测试,根据前面给出的关系我们可以推断出不论长按还是短按,都会产生OnLongClick事件。

by1)程序:不消化TouchDown,消化TouchUp,----操作:短时间单击按钮----结果:产生OnLongClick事件

by2)程序:不消化TouchDown,消化TouchUp,----操作:长时间单击按钮----结果:产生OnLongClick事件

测试结果满足我们的推断。

测试完全符合我们的预期,所以前面给出的关系是对的。

补充:OnClickListener和OnLongClickListener的关系,根据汉语的意思了,可能会感觉到这两个事件会有关系。但是事实是他们之间的关系是没有关系,前面已经给出这两个事件产生的条件了,而且是充分条件,这足已说明这两个事件没关系了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值