还是以自定义的TestButton为例。

我们可以通过重写onTouchEvent方法来处理诸如down move up的消息:

  1. public class TestButton extends Button {

  2. public TestButton(Context context) {
  3. super(context);
  4. // TODO Auto-generated constructor stub
  5. }

  6. public TestButton(Context context, AttributeSet attributeSet) {
  7. super(context, attributeSet);
  8. // TODO Auto-generated constructor stub
  9. }

  10. @Override
  11. public boolean onTouchEvent(MotionEvent event) {
  12. boolean value = super.onTouchEvent(event);
  13. System.out.println("super.onTouchEvent: " + value+ " event: " + event.getAction());
  14. return value;
  15. }
复制代码

也可以通过实现OnTouchListener的接口,然后设置TestButton的onTouchListener可以达到同样的目的

  1. class OnTouchListenerTest implements View.OnTouchListener{
  2. @Override
  3. public boolean onTouch(View v, MotionEvent event) {
  4. return false;
  5. }

  6. }

  7. TestButton b = (TestButton)findViewById(R.id.button);
  8. OnTouchListenerTest listener = new OnTouchListenerTest();
  9. b.setOnTouchListener(listener);
复制代码

但上述两种监听有什么区别呢?


先看一下Android源码中对于View中dispatchTouchEvent的实现:

  1. public boolean dispatchTouchEvent(MotionEvent event){
  2. ... ...
  3. if(onFilterTouchEventForSecurity(event)){
  4. ListenerInfo li = mListenerInfo;
  5. if(li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED
  6. && li.mOnTouchListener.onTouch(this, event)) {
  7. return true;
  8. }
  9. if(onTouchEvent(event)){
  10. return true;
  11. }
  12. }
  13. ... ...
  14. return false;
  15. }
复制代码 可以看到onTouchListener的接口的优先级是要高于onTouchEvent的,假若onTouchListener中的onTouch方法返回true,

表示此次事件已经被消费了,那onTouchEvent是接收不到消息的。

因为Button的performClick是利用onTouchEvent实现,假若onTouchEvent没有被调用到,那么Button的Click事件也无法响应。


综合来讲:

onTouchListener的onTouch方法优先级比onTouchEvent高,会先触发。

假如onTouch方法返回false会接着触发onTouchEvent,反之onTouchEvent方法不会被调用。

内置诸如click事件的实现等等都基于onTouchEvent,假如onTouch返回true,这些事件将不会被触发。


http://blog.csdn.net/huiguixian/article/details/22193977

更多相关文章

  1. XAMARIN Android获取WIFIMAC地址的方法
  2. 实时获取Android 各版本电量的统一方法
  3. 利用浏览器默认方法获取浏览器当前位置
  4. 【Android】实现Activity页面暂停几秒后跳转的两种方法
  5. android实现图片圆角化实现三种方法
  6. “android list targets 无target显示” 的解决方法。
  7. Android开发中获取本机Mac地址和IP地址的方法
  8. android 背景边框变圆角的几种方法
  9. Android中的onTouch()事件如何区分单击事件和滑动事件

随机推荐

  1. CyanogenMod 编译 Google Galaxy Nexus (
  2. Android电量和插拔电源状态广播监听
  3. Android(安卓)开机自启动程序
  4. Android(安卓)编程下通过 zipalign 对 AP
  5. Android(安卓)Volley库源码简析(HTTP Requ
  6. 调出软键盘 挤掉标题栏咋办
  7. 样式 主题 对话框 国际化
  8. Android(安卓)7.0 https/tls证书配置问题
  9. Android中onContextItemSelected不响应
  10. Android中获取屏幕相关信息(屏幕大小,状态