点击事件源码分析:
//为控件设置回调函数,在这里定义具体的回调方法
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(),并且定义具体的回调方法。
总结,在用户触摸按钮时,可以响应到具体回调方法中的代码。以上是使用“观察者-回调函数”思想分析点击事件的源码。
网友评论