public class TestActivity1 extends Activity {
private String TAG = TestActivity1.class.getSimpleName();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button = new Button(this);
button.setText("activity 1");
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(TestActivity1.this, TestActivity2.class));
}
});
button.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
MyLinearlayout linearlayout = new MyLinearlayout(this);
linearlayout.setClickable(true);
linearlayout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.i(TAG, "onTouch: ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.i(TAG, "onTouch: ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.i(TAG, "onTouch: ACTION_UP");
break;
}
return false;
}
});
button.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.i(TAG, "button onTouch: ======================================");
Log.i(TAG, "button onTouch: ACTION_DOWN");
Log.i(TAG, "button onTouch: ======================================");
break;
case MotionEvent.ACTION_MOVE:
Log.i(TAG, "button onTouch: ======================================");
Log.i(TAG, "button onTouch: ACTION_MOVE");
Log.i(TAG, "button onTouch: ======================================");
break;
case MotionEvent.ACTION_UP:
Log.i(TAG, "button onTouch: ======================================");
Log.i(TAG, "button onTouch: ACTION_UP");
Log.i(TAG, "button onTouch: ======================================");
break;
}
return false;
}
});
linearlayout.addView(button);
setContentView(linearlayout);
}
class MyLinearlayout extends LinearLayout {
public MyLinearlayout(Context context) {
this(context, null);
}
public MyLinearlayout(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public MyLinearlayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.i(TAG, "onInterceptTouchEvent: ");
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.i(TAG, "onInterceptTouchEvent: ACTION_DOWN");
return false;
case MotionEvent.ACTION_MOVE:
Log.i(TAG, "onInterceptTouchEvent: ACTION_MOVE");
return true;
case MotionEvent.ACTION_UP:
Log.i(TAG, "onInterceptTouchEvent: ACTION_UP");
return false;
}
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.i(TAG, "onTouchEvent: ACTION_DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.i(TAG, "onTouchEvent: ACTION_MOVE");
break;
case MotionEvent.ACTION_UP:
Log.i(TAG, "onTouchEvent: ACTION_UP");
break;
}
Log.i(TAG, "onTouchEvent: ");
return super.onTouchEvent(event);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Log.i(TAG, "dispatchTouchEvent: ");
return super.dispatchTouchEvent(ev);
}
}
}
测试代码
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
Log.i(TAG, "onInterceptTouchEvent: ");
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.i(TAG, "onInterceptTouchEvent: ACTION_DOWN");
return false;
case MotionEvent.ACTION_MOVE:
Log.i(TAG, "onInterceptTouchEvent: ACTION_MOVE");
return true;
case MotionEvent.ACTION_UP:
Log.i(TAG, "onInterceptTouchEvent: ACTION_UP");
return false;
}
return false;
}
dispatchTouchEvent:
onInterceptTouchEvent:
onInterceptTouchEvent: ACTION_DOWN
button onTouch: ======================================
button onTouch: ACTION_DOWN
button onTouch: ======================================
dispatchTouchEvent:
onInterceptTouchEvent:
onInterceptTouchEvent: ACTION_MOVE
dispatchTouchEvent:
onTouch: ACTION_MOVE
onTouchEvent: ACTION_MOVE
onTouchEvent:
dispatchTouchEvent:
onTouch: ACTION_MOVE
onTouchEvent: ACTION_MOVE
onTouchEvent:
dispatchTouchEvent:
onTouch: ACTION_MOVE
onTouchEvent: ACTION_MOVE
onTouchEvent:
dispatchTouchEvent:
onTouch: ACTION_MOVE
onTouchEvent: ACTION_MOVE
onTouchEvent:
dispatchTouchEvent:
onTouch: ACTION_MOVE
onTouchEvent: ACTION_MOVE
onTouchEvent:
dispatchTouchEvent:
onTouch: ACTION_MOVE
onTouchEvent: ACTION_MOVE
onTouchEvent:
dispatchTouchEvent:
onTouch: ACTION_UP
onTouchEvent: ACTION_UP
onTouchEvent:
方法执行顺序
dispatchTouchEvent -> onInterceptTouchEvent -> onTouch -> onTouchEvent
dispatchTouchEvent : false 所有动作都不执行。(重写该方法)该方法只执行一次。
dispatchTouchEvent : ture 所有动作都不执行。(重写该方法)该方法会重复执行。
onInterceptTouchEvent:false 所有的动作都不拦截。并且该方法会重复执行。
onInterceptTouchEvent:true 该动作之后的动作都会被拦截,并且只执行一次。如 在action_move 时拦截,则之后的actiion_up,也会被拦截,但是如果action_down 返回false,action_down 动作不会被拦截,且向下传递。