OnTouchListener和OnClickListener

来源:互联网 发布:大族激光软件 编辑:程序博客网 时间:2024/05/17 03:42

单击事件很简单,这里只说一个问题:isPressed()方法。

[java] view plaincopyprint?
  1.       /** 
  2.  * 点击事件 
  3.  *  
  4.  * @author mark 
  5.  *  
  6.  */  
  7. final class ClickListener implements OnClickListener {  
  8.   
  9.     @Override  
  10.     public void onClick(View v) {  
  11.         switch (v.getId()) {  
  12.         case BTN:  
  13.             if (v.isPressed()) {  
  14.                 btn.setText("单击按钮成功!");  
  15.             } else {  
  16.                 btn.setBackgroundColor(Color.BLUE);  
  17.             }  
  18.             /*if (!v.isPressed()) { 
  19.                 btn.setBackgroundColor(Color.BLUE); 
  20.             }*/  
  21.             break;  
  22.         }  
  23.     }  
  24. }  

点击Button可以触发该事件,if (v.isPressed()) 下面的代码可以执行,但是如 else 后面的或者注释掉的 if(! v.isPressed()) 代码不会被执行。

如果你想捕捉Button的按下与弹起的动作,需要实现OnTouchListener接口。最后再说这个问题

在开发中需要将长按事件如单击事件一起使用,现在我们去实现。写长按事件的代码:

[java] view plaincopyprint?
  1.       /** 
  2.  * 长按事件 
  3.  *  
  4.  * @author mark 
  5.  *  
  6.  */  
  7. final class LongListener implements OnLongClickListener {  
  8.   
  9.     @Override  
  10.     public boolean onLongClick(View v) {  
  11.         btn.setText("长按按钮成功!");  
  12.         return false;  
  13.     }  
  14. }  
为Button设置事件监听:

[java] view plaincopyprint?
  1. btn.setOnClickListener(new ClickListener());  
  2. btn.setOnLongClickListener(new LongListener());  
运行之后会发现,长按该Button不仅可以触发长按事件,而且还会触发单击事件,怎么办?

很简单,那就是在OnLongClickListener 事件中处理事件之后,告诉其它事件(这里是单击事件onClick)不要再来参与即可。修改代码如下:

[java] view plaincopyprint?
  1.       /** 
  2.  * 长按事件 
  3.  *  
  4.  * @author mark 
  5.  *  
  6.  */  
  7. final class LongListener implements OnLongClickListener {  
  8.   
  9.     @Override  
  10.     public boolean onLongClick(View v) {  
  11.         btn.setText("长按按钮成功!");  
  12.         // return false;  
  13.         return true;  
  14.     }  
  15. }  

可以看出,单击事件与长按事件分开了。
最后,我们讨论一下如何捕捉Button 的按下与弹起事件。实现代码:

[java] view plaincopyprint?
  1.       /** 
  2.  * 触摸事件 
  3.  *  
  4.  * @author mark 
  5.  *  
  6.  */  
  7. final class TouchListener implements OnTouchListener {  
  8.   
  9.     @Override  
  10.     public boolean onTouch(View v, MotionEvent event) {  
  11.         if (event.getAction() == KeyEvent.ACTION_DOWN) {  
  12.             btn.setText("已经按下按钮");  
  13.         }  
  14.         if (event.getAction() == KeyEvent.ACTION_UP) {  
  15.             btn.setText("按钮已经弹起");  
  16.         }  
  17.         return true;// 返回true的话,单击事件、长按事件不可以被触发  
  18.         // return false;  
  19.     }  
  20. }  
完整代码实例:

[java] view plaincopyprint?
  1. package mark.zhang;  
  2.   
  3. import android.app.Activity;  
  4. import android.graphics.Color;  
  5. import android.os.Bundle;  
  6. import android.util.Log;  
  7. import android.view.Gravity;  
  8. import android.view.KeyEvent;  
  9. import android.view.MotionEvent;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.view.View.OnLongClickListener;  
  13. import android.view.View.OnTouchListener;  
  14. import android.widget.Button;  
  15. import android.widget.LinearLayout;  
  16.   
  17. public class TestActivity extends Activity {  
  18.     private static final int BTN = 0x10;  
  19.   
  20.     private Button btn = null;  
  21.   
  22.     @Override  
  23.     public void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         // 必须先装载该布局文件,否则报空指针异常  
  26.         setContentView(R.layout.main);  
  27.         LinearLayout ll = (LinearLayout) findViewById(R.id.ll);  
  28.         // 布局参数设定  
  29.         LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(12050);  
  30.         lp.gravity = Gravity.CENTER;  
  31.         // 创建Button并设置参数  
  32.         btn = new Button(this);  
  33.         btn.setText("Click me");  
  34.         btn.setId(BTN);  
  35.         btn.setLayoutParams(lp);  
  36.         // 加入当前视图  
  37.         ll.addView(btn);  
  38.         // 为Button设置监听器  
  39.         btn.setOnClickListener(new ClickListener());  
  40.         btn.setOnTouchListener(new TouchListener());  
  41.         btn.setOnLongClickListener(new LongListener());  
  42.     }  
  43.   
  44.     /** 
  45.      * 点击事件 
  46.      *  
  47.      * @author mark 
  48.      *  
  49.      */  
  50.     final class ClickListener implements OnClickListener {  
  51.   
  52.         @Override  
  53.         public void onClick(View v) {  
  54.             switch (v.getId()) {  
  55.             case BTN:  
  56.                 if (v.isPressed()) {  
  57.                     btn.setText("单击按钮成功!");  
  58.                     Log.d("mark""onclick");  
  59.                 } else {  
  60.                     btn.setBackgroundColor(Color.BLUE);  
  61.                 }  
  62.                 /* 
  63.                  * if (!v.isPressed()) { btn.setBackgroundColor(Color.BLUE); } 
  64.                  */  
  65.                 break;  
  66.             }  
  67.         }  
  68.     }  
  69.   
  70.     /** 
  71.      * 长按事件 
  72.      *  
  73.      * @author mark 
  74.      *  
  75.      */  
  76.     final class LongListener implements OnLongClickListener {  
  77.   
  78.         @Override  
  79.         public boolean onLongClick(View v) {  
  80.             btn.setText("长按按钮成功!");  
  81.             // return false;  
  82.             return true;  
  83.         }  
  84.     }  
  85.   
  86.     /** 
  87.      * 触摸事件 
  88.      *  
  89.      * @author mark 
  90.      *  
  91.      */  
  92.     final class TouchListener implements OnTouchListener {  
  93.   
  94.         @Override  
  95.         public boolean onTouch(View v, MotionEvent event) {  
  96.             if (event.getAction() == KeyEvent.ACTION_DOWN) {  
  97.                 btn.setText("已经按下按钮");  
  98.             }  
  99.             if (event.getAction() == KeyEvent.ACTION_UP) {  
  100.                 btn.setText("按钮已经弹起");  
  101.             }  
  102.             return true;// 返回true的话,单击事件、长按事件不可以被触发  
  103.             // return false;  
  104.         }  
  105.     }