Android------三种监听OnTouchListener、OnLongClickListener同时实现即其中返回值true或者false的含义

引自:http://5200415.blog.51cto.com/3851969/1003113 

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

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

package com.example.testlistenerdemo;    
import android.os.Bundle;  
import android.app.Activity;  
import android.util.Log;  
import android.view.Menu;  
import android.view.MenuItem;  
import android.view.MotionEvent;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.view.View.OnLongClickListener;  
import android.view.View.OnTouchListener;  
import android.widget.Button;  
import android.support.v4.app.NavUtils;    
public class MainActivity extends Activity {        
private Button button;      
@Override      
public void onCreate(Bundle savedInstanceState) {          
super.onCreate(savedInstanceState);          
setContentView(R.layout.activity_main);          
button = (Button)findViewById(R.id.button);                    
button.setOnTouchListener(touchListener);                    
button.setOnClickListener(clickListener);                    
button.setOnLongClickListener(longClickListener);      
}            
public OnTouchListener touchListener = new OnTouchListener() {                    
@Override          
public boolean onTouch(View v, MotionEvent event) { 
             //按下              
if(event.getAction()==MotionEvent.ACTION_DOWN){                  
Log.i("log","action_down");                  
return true;              
}else if(event.getAction()==MotionEvent.ACTION_UP){                  
Log.i("log","action_up");                  
return true;              
}else if(event.getAction()==MotionEvent.ACTION_MOVE){                  
Log.i("log","action_move");                  
return true;             
 }              
return false;         
 }     
 };            
 public OnClickListener clickListener = new OnClickListener() {                    
 @Override          
 public void onClick(View v) {              
 Log.i("long", "click");          
 }      
 };            
 public OnLongClickListener longClickListener = new OnLongClickListener() {                    
 @Override          
 public boolean onLongClick(View v) {              
 Log.i("long", "long click");             
  return false;          
  }     
   };     
    }  

在都是返回true值的情况下,只会监听到onTouchListener。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、onLongClickListeneraction_down、action_up、

  • //按下 
  •             if(event.getAction()==MotionEvent.ACTION_DOWN){ 
  •                 Log.i("log","action_down"); 
  •                 return false; 
  •             }else if(event.getAction()==MotionEvent.ACTION_UP){ 
  •                 Log.i("log","action_up"); 
  •                 return false; 
  •             } 
  • 
    

    执行结果:

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

    ④:

    注意

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

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

    一个例子:

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

package com.example.viewdemo; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.LinearLayout;  
public class MainActivity extends Activity{      
@Override     
protected void onCreate(Bundle savedInstanceState) {
         // TODO Auto-generated method stub         
super.onCreate(savedInstanceState);         
setContentView(R.layout.activity_main);         
LinearLayout root = (LinearLayout)findViewById(R.id.root);         
//创建DrawView组件         
final DrawView draw = new DrawView(this);         
//设置自定义组件的最大宽度和高度         
draw.setMinimumWidth(300);         
draw.setMinimumHeight(500);                  
draw.setOnTouchListener(new View.OnTouchListener() {                          
public boolean onTouch(View v, MotionEvent event) {                 
draw.currentX = event.getX();                 
draw.currentY = event.getY();                 
//通知 组件重绘                 
draw.invalidate();                 
//返回true表明处理方法已经处理该事件                 
return true;             
}         
});         
root.addView(draw);     
}      
}  
package com.example.viewdemo;  
import android.app.Activity; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.LinearLayout;  
public class MainActivity extends Activity{      
@Override     
protected void onCreate(Bundle savedInstanceState) {         
// TODO Auto-generated method stub         
super.onCreate(savedInstanceState);        
setContentView(R.layout.activity_main);         
LinearLayout root = (LinearLayout)findViewById(R.id.root);         
//创建DrawView组件         
final DrawView draw = new DrawView(this);         
//设置自定义组件的最大宽度和高度         
draw.setMinimumWidth(300);         
draw.setMinimumHeight(500);                  
draw.setOnTouchListener(new View.OnTouchListener() {                          
public boolean onTouch(View v, MotionEvent event) {                 
draw.currentX = event.getX();                 
draw.currentY = event.getY();                 
//通知 组件重绘                 
draw.invalidate();                 
//返回true表明处理方法已经处理该事件                 
return true;             
}         
});         
root.addView(draw);     
}      
} 

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

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

以后最后都使用return true;

原文地址:https://www.cnblogs.com/Anita9002/p/4323760.html