android应用中常用的监听OnTouchListener、OnClickListener、OnLongClickListener。

首先在Activity中创建一个button,然后对这个button同时设置OnTouchListener、OnClickListener、OnLongClickListener这三种监听方式。


①:

 

 
  
  1. package com.example.testlistenerdemo;  
  2.   
  3. import android.os.Bundle;  
  4. import android.app.Activity;  
  5. import android.util.Log;  
  6. import android.view.Menu;  
  7. import android.view.MenuItem;  
  8. import android.view.MotionEvent;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.view.View.OnLongClickListener;  
  12. import android.view.View.OnTouchListener;  
  13. import android.widget.Button;  
  14. import android.support.v4.app.NavUtils;  
  15.   
  16. public class MainActivity extends Activity {  
  17.   
  18.     private Button button;  
  19.     @Override  
  20.     public void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.activity_main);  
  23.         button = (Button)findViewById(R.id.button);  
  24.           
  25.         button.setOnTouchListener(touchListener);  
  26.           
  27.         button.setOnClickListener(clickListener);  
  28.           
  29.         button.setOnLongClickListener(longClickListener);  
  30.     }  
  31.       
  32.     public OnTouchListener touchListener = new OnTouchListener() {  
  33.           
  34.         @Override  
  35.         public boolean onTouch(View v, MotionEvent event) {  
  36.             //按下  
  37.             if(event.getAction()==MotionEvent.ACTION_DOWN){  
  38.                 Log.i("log","action_down");  
  39.                 return true;  
  40.             }else if(event.getAction()==MotionEvent.ACTION_UP){  
  41.                 Log.i("log","action_up");  
  42.                 return true;  
  43.             }else if(event.getAction()==MotionEvent.ACTION_MOVE){  
  44.                 Log.i("log","action_move");  
  45.                 return true;  
  46.             }  
  47.             return false;  
  48.         }  
  49.     };  
  50.       
  51.     public OnClickListener clickListener = new OnClickListener() {  
  52.           
  53.         @Override  
  54.         public void onClick(View v) {  
  55.             Log.i("long""click");  
  56.         }  
  57.     };  
  58.       
  59.     public OnLongClickListener longClickListener = new OnLongClickListener() {  
  60.           
  61.         @Override  
  62.         public boolean onLongClick(View v) {  
  63.             Log.i("long""long click");  
  64.             return false;  
  65.         }  
  66.     };      
  67. }  

在都是返回true值的情况下,只会监听到onTouchListenerOnClickListener、OnLongClickListener不能被监听到。

长按和短按按钮都只能触发onTouchListener的事件。

action_down处理完需要做的事情之后就返回true,表示action_down 事件已经被消耗了不管你怎么的click或者longclick 都不会得到响应。

②:

改变onTouchListener里的代码。将true改为false。

 
  
  1. if(event.getAction()==MotionEvent.ACTION_DOWN){  
  2.                 Log.i("log","action_down");  
  3.                 return false;  
  4.             }  

效果为:


3个为一组。长按和短按按钮只会触发OnTouchListener、onLongClickListener事件。如果长按,则出现action_down、long click、action_up。短按则是action_down、action_up、long click,短按触发long click是因为action_up返回了true,它在起作用。因为没有更改长按的时间而是使用系统的500ms,所以在手离开手机屏幕的时候就又有了一次long click。

③:

 

 
  
  1. //按下 
  2.             if(event.getAction()==MotionEvent.ACTION_DOWN){ 
  3.                 Log.i("log","action_down"); 
  4.                 return false
  5.             }else if(event.getAction()==MotionEvent.ACTION_UP){ 
  6.                 Log.i("log","action_up"); 
  7.                 return false
  8.             } 

执行结果:

 

前3个为短按。后4个为长按。

④:

注意

action_up 返回true时要注意。如果你同时使用这三种监听的话。action_up之后如果产生long click的话。button可是一直处于按下的状态。可以从控件的颜色上看得到。

再者,使用OnLongClickListener 的时候也要注意它的返回值,返回true时会使手机的振动一下。而返回false时则不会有这种效果。

true和false在其中起着标志事件是否被消耗,如果消耗了就不再传递给其他控件了。如果没有消耗则还会传递给其他控件,触发其他控件的事件处理函数

一个例子:

 

画红色圆点随着鼠标点击拖动而拖动,看的到拖动的痕迹。

 

 
  
  1. package com.example.viewdemo; 
  2.  
  3. import android.app.Activity; 
  4. import android.os.Bundle; 
  5. import android.view.MotionEvent; 
  6. import android.view.View; 
  7. import android.widget.LinearLayout; 
  8.  
  9. public class MainActivity extends Activity{ 
  10.  
  11.     @Override 
  12.     protected void onCreate(Bundle savedInstanceState) { 
  13.         // TODO Auto-generated method stub 
  14.         super.onCreate(savedInstanceState); 
  15.         setContentView(R.layout.activity_main); 
  16.         LinearLayout root = (LinearLayout)findViewById(R.id.root); 
  17.         //创建DrawView组件 
  18.         final DrawView draw = new DrawView(this); 
  19.         //设置自定义组件的最大宽度和高度 
  20.         draw.setMinimumWidth(300); 
  21.         draw.setMinimumHeight(500); 
  22.          
  23.         draw.setOnTouchListener(new View.OnTouchListener() { 
  24.              
  25.             public boolean onTouch(View v, MotionEvent event) { 
  26.                 draw.currentX = event.getX(); 
  27.                 draw.currentY = event.getY(); 
  28.                 //通知 组件重绘 
  29.                 draw.invalidate(); 
  30.                 //返回true表明处理方法已经处理该事件 
  31.                 return true
  32.             } 
  33.         }); 
  34.         root.addView(draw); 
  35.     } 
  36.      

 

 
  
  1. package com.example.viewdemo; 
  2.  
  3. import android.app.Activity; 
  4. import android.os.Bundle; 
  5. import android.view.MotionEvent; 
  6. import android.view.View; 
  7. import android.widget.LinearLayout; 
  8.  
  9. public class MainActivity extends Activity{ 
  10.  
  11.     @Override 
  12.     protected void onCreate(Bundle savedInstanceState) { 
  13.         // TODO Auto-generated method stub 
  14.         super.onCreate(savedInstanceState); 
  15.         setContentView(R.layout.activity_main); 
  16.         LinearLayout root = (LinearLayout)findViewById(R.id.root); 
  17.         //创建DrawView组件 
  18.         final DrawView draw = new DrawView(this); 
  19.         //设置自定义组件的最大宽度和高度 
  20.         draw.setMinimumWidth(300); 
  21.         draw.setMinimumHeight(500); 
  22.          
  23.         draw.setOnTouchListener(new View.OnTouchListener() { 
  24.              
  25.             public boolean onTouch(View v, MotionEvent event) { 
  26.                 draw.currentX = event.getX(); 
  27.                 draw.currentY = event.getY(); 
  28.                 //通知 组件重绘 
  29.                 draw.invalidate(); 
  30.                 //返回true表明处理方法已经处理该事件 
  31.                 return true
  32.             } 
  33.         }); 
  34.         root.addView(draw); 
  35.     } 
  36.      

这里的OnTouchListener事件,如果return false。不会看到圆点拖动的痕迹。而是鼠标点击才会出现在相应位置。

 

说明true表示,拖动圆点一系列是一个事件。

以后最后都使用return true;