zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    最长公共子序列算法问题代码(使用JavaScript实现)
    硬币找零问题算法几种不同的代码实现方式(使用Python实现)
    基数排序(使用Python实现)
    桶排序(使用Python实现)
    减法要用 signed 型
    16系列和18系列的不同
    Proteus中常用元器件名字
    数值类型
    PIC单片机之时钟设置
    MOS管使PIC单片机不能正常运行
  • 原文地址:https://www.cnblogs.com/Anita9002/p/4323760.html
Copyright © 2011-2022 走看看