OnTouchListener和OnCliskListener

来源:互联网 发布:seo软件工具 编辑:程序博客网 时间:2024/05/29 17:45

在Android App应用中,OnTouch事件表示触摸事件,本章我们通过滑过图像获取当前位置理解其具体用法。

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

 /**  * 点击事件  *   * @author mark  *   */  final class ClickListener implements OnClickListener {        @Override      public void onClick(View v) {          switch (v.getId()) {          case BTN:              if (v.isPressed()) {                  btn.setText("单击按钮成功!");              } else {                  btn.setBackgroundColor(Color.BLUE);              }              /*if (!v.isPressed()) {                 btn.setBackgroundColor(Color.BLUE);             }*/              break;          }      }  }  

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

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

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

 /**  * 长按事件  *   * @author mark  *   */  final class LongListener implements OnLongClickListener {        @Override      public boolean onLongClick(View v) {          btn.setText("长按按钮成功!");          return false;      }  }  

为Button设置事件监听:

btn.setOnClickListener(new ClickListener());  btn.setOnLongClickListener(new LongListener()); 

 运行之后会发现,长按该Button不仅可以触发长按事件,而且还会触发单击事件,怎么办?

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

 /**  * 长按事件  *   * @author mark  *   */  final class LongListener implements OnLongClickListener {        @Override      public boolean onLongClick(View v) {          btn.setText("长按按钮成功!");          // return false;          return true;      }  }  

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

/**  * 触摸事件  *   * @author mark  *   */  final class TouchListener implements OnTouchListener {        @Override      public boolean onTouch(View v, MotionEvent event) {          if (event.getAction() == KeyEvent.ACTION_DOWN) {              btn.setText("已经按下按钮");          }          if (event.getAction() == KeyEvent.ACTION_UP) {              btn.setText("按钮已经弹起");          }          return true;// 返回true的话,单击事件、长按事件不可以被触发          // return false;      }  }  

完整代码实例:

package mark.zhang;    import android.app.Activity;  import android.graphics.Color;  import android.os.Bundle;  import android.util.Log;  import android.view.Gravity;  import android.view.KeyEvent;  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.widget.LinearLayout;   public class TestActivity extends Activity {      private static final int BTN = 0x10;       private Button btn = null;        @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          // 必须先装载该布局文件,否则报空指针异常          setContentView(R.layout.main);          LinearLayout ll = (LinearLayout) findViewById(R.id.ll);          // 布局参数设定          LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(120, 50);          lp.gravity = Gravity.CENTER;          // 创建Button并设置参数          btn = new Button(this);          btn.setText("Click me");          btn.setId(BTN);          btn.setLayoutParams(lp);          // 加入当前视图          ll.addView(btn);          // 为Button设置监听器          btn.setOnClickListener(new ClickListener());          btn.setOnTouchListener(new TouchListener());          btn.setOnLongClickListener(new LongListener());      }        /**      * 点击事件      *       * @author mark      *       */      final class ClickListener implements OnClickListener {            @Override          public void onClick(View v) {              switch (v.getId()) {              case BTN:                  if (v.isPressed()) {                      btn.setText("单击按钮成功!");                      Log.d("mark", "onclick");                  } else {                      btn.setBackgroundColor(Color.BLUE);                  }                  /*                  * if (!v.isPressed()) { btn.setBackgroundColor(Color.BLUE); }                  */                  break;              }          }      }        /**      * 长按事件      *       * @author mark      *       */      final class LongListener implements OnLongClickListener {            @Override          public boolean onLongClick(View v) {              btn.setText("长按按钮成功!");              // return false;              return true;          }      }        /**      * 触摸事件      *       * @author mark      *       */      final class TouchListener implements OnTouchListener {            @Override          public boolean onTouch(View v, MotionEvent event) {              if (event.getAction() == KeyEvent.ACTION_DOWN) {                  btn.setText("已经按下按钮");              }              if (event.getAction() == KeyEvent.ACTION_UP) {                  btn.setText("按钮已经弹起");              }              return true;// 返回true的话,单击事件、长按事件不可以被触发              // return false;          }      }  } 


0 0