您的位置:首页 > 移动开发 > Android开发

Android事件分发机制

2016-04-24 16:27 330 查看
我们在MainActivity中注册一个Button按钮,分别为它设置onClick和onTouch事件

        setContentView(R.layout.activity_main);

        button = (Button)findViewById(R.id.dispatch_button);

        button.setOnClickListener(new OnClickListener() {

            

            @Override

            public void onClick(View v) {

                // TODO Auto-generated method stub

                Log.v("TAG", "onClick");

            }

        });

        button.setOnTouchListener(new OnTouchListener() {

            

            @Override

            public boolean onTouch(View v, MotionEvent event) {

                // TODO Auto-generated method stub

                Log.v("TAG", String.valueOf(event.getAction()));

                return false;

            }

        });

    }
   onTouch事件会比onClick更优先执行,而且只有onTouch返回false的时候,onClick才会被执行,原因是,view在被点击后,都会调用dispatchTouchEvent方法,

        if (onFilterTouchEventForSecurity(event)) {

            //noinspection SimplifiableIfStatement

            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;

            }

        }

回调onTouch方法以后,如果返回true,那么onTouchEvent将不会被执行,其内部包含了第一个监听器的onClick方法,直接会被忽略不执行,该按钮被按下后,ACTION_DOWN,ACTION_UP,ACTION_MOVE会被反复执行,也即事件会被反复分发,这里为什么每次onTouchEvent被执行,onClick却只被执行一次,原因是onTouchEvent方法中会判断是ACTION_DOWN,ACTION_UP,,只有ACTION_UP中才执行了performClick方法,该方法执行了clickListener中的onClick方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: