设计模式-观察者模式-应用

2019-09-25  本文已影响0人  方_f666

点击事件源码分析:

        //为控件设置回调函数,在这里定义具体的回调方法
        findViewById(R.id.text).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });

大家一定使用过这样普通的点击事件,我们来用“观察者-回调函数”思想分析下源码:
首先点入OnClickListener看一下源码,这是一个写在View类中的回调接口OnClickListener,接口中有一个onClick()方法。

    //声明回调接口
    public interface OnClickListener {
        void onClick(View v);
    }

然后点击setOnClickListener,进入到View类中查看:

    public void setOnClickListener(@Nullable OnClickListener l) {
        if (!isClickable()) {
            setClickable(true);
        }
        //设置回调接口对象的成员变量
        getListenerInfo().mOnClickListener = l;
    }

然后在View类中搜索onClick方法会调用到performClick():

    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);
        notifyEnterOrExitForAutoFillIfNeeded(true);
        return result;
    }

在View类中performClick()方法是被onTouchEvent()方法所调用:

    public boolean onTouchEvent(MotionEvent event) {
        if (mPerformClick == null) {
            mPerformClick = new PerformClick();
        }
        if (!post(mPerformClick)) {
            performClick();
        }
    }

1.当用户触摸按钮时,根据正常的事件分发机制,是最上层的View进行响应,调用最上层view的onTouchEvent()消化这个点击触摸事件。
2.同时onTouchEvent()会调用performClick(),然而在performClick()中调用了回调接口对象的onClick()方法
3.在其他类中调用view的setOnClickListener(),并且定义具体的回调方法。
总结,在用户触摸按钮时,可以响应到具体回调方法中的代码。以上是使用“观察者-回调函数”思想分析点击事件的源码。

上一篇 下一篇

猜你喜欢

热点阅读