安卓OnTouchListener,onTouchEvent,onClickListener执行顺序

原创 2017年08月03日 20:08:00

安卓控件有很多监听事件,比较典型的有OnTouchListener,onTouchEvent和mOnClickListener,来看下他们的执行顺序
我们先自定义一个Button,在他的onTouchEvent方法中加入log

@Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.e("xw", "onTouchEvent");
        return super.onTouchEvent(event);
    }

放进布局后在Activity中设置回调

bt1.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Log.e("xw", "OnTouchListener");
                return false;
            }
        });

bt1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e("xw", "OnClickListener");
            }
        });

之后单击下,log信息为
这里写图片描述

可见是首先执行OnTouchListener,之后为onTouchEvent,最后才执行onClickListener内的方法,至于为什么OnTouchListener和onTouchEvent执行了两次,是因为在DOWN和UP时两个方法都被调用,至于onClickListener则只在UP的时候调用

我们看下安卓是怎么实现的

与事件分发相关联的三个方法分别为dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent,直接去看View的dispatchTouchEvent方法

public boolean dispatchTouchEvent(MotionEvent event) {
        ......
        ListenerInfo li = mListenerInfo;
        if (li != null && li.mOnTouchListener != null
                && (mViewFlags & ENABLED_MASK) == ENABLED
                && li.mOnTouchListener.onTouch(this, event)) {
            result = true;
        }
        if (!result && onTouchEvent(event)) {
            result = true;
        }
        ......
        return result;
    }

我们先看ListenerInfo ,他是View的一个内部静态类

 static class ListenerInfo {

        protected OnFocusChangeListener mOnFocusChangeListener;
        private ArrayList<OnLayoutChangeListener> mOnLayoutChangeListeners;
        protected OnScrollChangeListener mOnScrollChangeListener;
        private CopyOnWriteArrayList<OnAttachStateChangeListener> mOnAttachStateChangeListeners;
        public OnClickListener mOnClickListener;
        protected OnLongClickListener mOnLongClickListener;
        protected OnContextClickListener mOnContextClickListener;
        protected OnCreateContextMenuListener mOnCreateContextMenuListener;
        ......

    }

里面存储着View的各个Listener,我们之前设置的OnTouchListener也在其中

public void setOnTouchListener(OnTouchListener l) {
        getListenerInfo().mOnTouchListener = l;
    }

ListenerInfo getListenerInfo() {
        if (mListenerInfo != null) {
            return mListenerInfo;
        }
        mListenerInfo = new ListenerInfo();
        return mListenerInfo;
    }

其他的像onClickListener也是这样存储

回来我们接着看dispatchTouchEvent方法,从上面我们可以知道如果有的话OnTouchListener是比onTouchEvent先执行的,当然前提是OnTouchListener返回false,即OnTouchListener并没有处理事件

接着调用onTouchEvent方法

public boolean onTouchEvent(MotionEvent event) {
        ......
        switch (action) {
             case MotionEvent.ACTION_UP:
                  ......
                  performClick();
                  ......
                  break;
        ......
    }

public boolean performClick() {
        final boolean result;
        final ListenerInfo li = mListenerInfo;
        if (li != null && li.mOnClickListener != null) {
            playSoundEffect(SoundEffectConstants.CLICK);
            li.mOnClickListener.onClick(this);
            result = true;
        } else {
            result = false;
        }
        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
        return result;
    }

在View的onTouchEvent方法中,如果判断事件为MotionEvent.ACTION_UP时,则会调用performClick,而在performClick中则会回调mOnClickListener的onClick方法,即点击事件被回调,同时直接返回true

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

论onclicklistener、ontouchlistener、ontouchevent

本人新人写点自己的心得和

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

android应用中常用的监听OnTouchListener、OnClickListener、OnLongClickListener,大家肯定经常使用。但是你真的知道它会产生的神奇效果么?不要忽视这些...

Android 事件分发 OnClickListener 和 OnTouchListener 的事件处理原理简单描述

在这次的实验练习中,我们只采用了一个 Button 去

浅谈OnTouchListener,OnClickListener和OnLongClickListener的关系

初学Android,发现如题的这几个关系有点乱,经过查资料和自己做了个小测试,把这几个关系弄清楚了,发出来与大家分享。 先贴上本人小测试的代码: [java] view ...

你真的会用OnTouchListener、OnClickListener、OnLongClickListener监听事件么?

android应用中常用的监听OnTouchListener、OnClickListener、OnLongClickListener,大家肯定经常使用。但是你真的知道它会产生的神奇效果么?不要忽视这些...

OnTouch三种OnClickListener、OnTouchListener、OnLongClickListener的学习

先上代码: package com.enjoy.ontouchactivity; import android.os.Bundle; import android.app.Activity; imp...

ListView的OnTouchListener和OnClickListener的研究

转载自http://www.cnblogs.com/transmuse/archive/2010/12/01/1893799.html 1. ListView的OnItemCli...

【转】android对OnTouchListener、OnClickListener等事件响应的研究

转自:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=162514   前几天遇到一个小问题,就是给listview添加onItemC...

Android OnTouchListener实时监听触点坐标,需要同时监听OnClickListener才有效

public class TouchTestActivity extends Activity { /** Called when the activity is first created....
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)