onTouchListener与onClickListener

版权声明:本文为转载 https://blog.csdn.net/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的关系,根据汉语的意思了,可能会感觉到这两个事件会有关系。但是事实是他们之间的关系是没有关系,前面已经给出这两个事件产生的条件了,而且是充分条件,这足已说明这两个事件没关系了。

你可能感兴趣的:(android)