如果View处理事件流程
1. 如果设置了onTouchListener 首先执行onTouchListener 中的onTouch 方法,根据onTouch 的返回值进行其他操作.
(1) 如果onTouch返回了true 则View的onTouchEvent 不会被调用.
// onTouch 返回 true
// 按下按钮时
D/MainActivity: onTouch: ACTION_DOWN
// 松开按钮时
D/MainActivity: onTouch: ACTION_UP
(2) 如果onTouch 返回了false. 则View的onTouchEvent()将会被执行 .测试如果设置了OnClickListener 则 OnClickListener中的onClick() 方法将会被执行 .也就是说onClickListener的优先级最低.
// onTouch 返回false
// 按下按钮时
D/MainActivity: onTouch: ACTION_DOWN
D/WSJButton_01: onTouchEvent: ACTION_DOWN
D/WSJButton_01: onTouchEvent 被调用
// 松开按钮时
D/MainActivity: onTouch: ACTION_UP
D/WSJButton_01: onTouchEvent: ACTION_UP
D/WSJButton_01: onTouchEvent 被调用
D/MainActivity: onClick: 执行
2. 如果没有设置onTouchListener则默认和onTouch返回false的情况一样.
// 没有设置OnTouchListener
// 按钮被按下
D/WSJButton_01: onTouchEvent: ACTION_DOWN
D/WSJButton_01: onTouchEvent 被调用
// 松开按钮时
D/WSJButton_01: onTouchEvent: ACTION_UP
D/WSJButton_01: onTouchEvent 被调用
D/MainActivity: onClick: 执行
测试代码
自定义Button
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.Button;
/**
* 测试View事件的自定义Button
* Created by WSJ on 2016/12/14.
*/
public class WSJButton_01 extends Button {
private static final String TAG = "WSJButton_01";
public WSJButton_01(Context context) {
this(context,null);
}
public WSJButton_01(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public WSJButton_01(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
Log.d(TAG,"构造方法被调用");
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
Log.d(TAG, "onTouchEvent: ACTION_DOWN");
break;
case MotionEvent.ACTION_UP:
Log.d(TAG, "onTouchEvent: ACTION_UP");
break;
}
return super.onTouchEvent(event);
}
}
Button设置Listener
mButtonTest = (Button) findViewById(R.id.btn_test_event);
mButtonTest.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
Log.d(TAG, "onTouch: ACTION_DOWN");
break;
case MotionEvent.ACTION_UP:
Log.d(TAG, "onTouch: ACTION_UP");
break;
}
// 返回 false onTouchEvent 将会执行.----> onClick 也会执行
return false;
// 返回 true onTouchEvent将不会被调用.
// return true;
}
});
mButtonTest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: 执行");
}
});