Android dispatchTouchEvent

dispatchTouchEvent

// 没有子视图的 View 的 dispatchTouchEvent() 方法
public boolean dispatchTouchEvent(MotionEvent event)
 {
	// ...
 
 	// View.setOnTouchLisener() 方法设置的触摸事件监听者
	ListenerInfo li = mListenerInfo;

	// 如果设置了监听者, 优先调用 OnTouchListener.onTouch()
	if (li != null && li.mOnTouchListener != null
			&& (mViewFlags & ENABLED_MASK) == ENABLED
			&& li.mOnTouchListener.onTouch(this, event)) {

		// 如果 OnTouchListener.onTouch() 完成了事件处理
		return true;
	}

	// 如果监听者没有完成事件处理(或者没有监听者), 再调用 onTouchEvent()
	if (onTouchEvent(event)) {
		// 如果 onTouchEvent() 完成了事件处理
		return true;
	}

	// ...

	// 如果 OnTouchListener.onTouch() 和 onTouchEvent() 都没有完成事件处理
	return false;
}


onTouchListener的接口的优先级是要高于onTouchEvent的,假若onTouchListener中的onTouch方法返回true,那onTouchEvent是接收不到消息的,因为Button的performClick是在onTouchEvent实现,假若onTouchEvent没有被调用到,那么Button的Click事件也无法响应

//performClick 是使用代码主动去调用控件的点击事件(模拟人手去触摸控件)
-----------------------------------------
boolean android.view.View.performClick()

Call this view‘s OnClickListener, if it is defined.
Returns:
True there was an assigned OnClickListener that was called, false otherwise is returned.
---------------------------------------------
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);
    
    btn1 = (Button) findViewById(R.id.button1);
    tv1 = (TextView) findViewById(R.id.textView1);
    btn1.performClick();
    btn1.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
        tv1.setText("已经被点击过了");
        }
    });
}

http://www.cnblogs.com/superlcr/p/3946034.html?utm_source=tuicool

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。