如果View處理事件流程
1. 如果設(shè)置了onTouchListener 首先執(zhí)行onTouchListener 中的onTouch 方法,根據(jù)onTouch 的返回值進行其他操作.
(1) 如果onTouch返回了true 則View的onTouchEvent 不會被調(diào)用.
// onTouch 返回 true
// 按下按鈕時
D/MainActivity: onTouch: ACTION_DOWN
// 松開按鈕時
D/MainActivity: onTouch: ACTION_UP
(2) 如果onTouch 返回了false. 則View的onTouchEvent()將會被執(zhí)行 .測試如果設(shè)置了OnClickListener 則 OnClickListener中的onClick() 方法將會被執(zhí)行 .也就是說onClickListener的優(yōu)先級最低.
// onTouch 返回false
// 按下按鈕時
D/MainActivity: onTouch: ACTION_DOWN
D/WSJButton_01: onTouchEvent: ACTION_DOWN
D/WSJButton_01: onTouchEvent 被調(diào)用
// 松開按鈕時
D/MainActivity: onTouch: ACTION_UP
D/WSJButton_01: onTouchEvent: ACTION_UP
D/WSJButton_01: onTouchEvent 被調(diào)用
D/MainActivity: onClick: 執(zhí)行
2. 如果沒有設(shè)置onTouchListener則默認(rèn)和onTouch返回false的情況一樣.
// 沒有設(shè)置OnTouchListener
// 按鈕被按下
D/WSJButton_01: onTouchEvent: ACTION_DOWN
D/WSJButton_01: onTouchEvent 被調(diào)用
// 松開按鈕時
D/WSJButton_01: onTouchEvent: ACTION_UP
D/WSJButton_01: onTouchEvent 被調(diào)用
D/MainActivity: onClick: 執(zhí)行
測試代碼
自定義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,"構(gòu)造方法被調(diào)用");
}
@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設(shè)置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 將會執(zhí)行.----> onClick 也會執(zhí)行
return false;
// 返回 true onTouchEvent將不會被調(diào)用.
// return true;
}
});
mButtonTest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: 執(zhí)行");
}
});