一、Touch事件的传递机制
二、viewpager和view的事件响应规则
1. 当滑动很慢并且滑动很短距离的时候,viewpager和view的事件全部执行
2. 当滑动很快并且滑动较长的距离或者切换的界面的时候,会执行view的Cancel事件,结束掉view的所有事件,会只执行viewpager的事件
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {case MotionEvent.ACTION_DOWN://getParent() : 获取控件的父控件getParent().requestDisallowInterceptTouchEvent(true); //设置是否父控件拦截事件,true:传递事件,false:拦截事件startX = (int) ev.getX();startY = (int) ev.getY();break;}
三、Viewpager和内部嵌套的View的事件交互规则
//1,按下事件作用在内部view上
//2,当滑动稍许距离,加速度未达到一定值时,对应滑动事件作用在view身上
//3,当滑动达到一定距离,并且加速度达到一定值,(比如翻页 切换界面)内部的view触发cancel事件,然后将滑动的事件返还给父控件(ViewPager)
@Override
public
Object instantiateItem(ViewGroup
container
,
int
position
) {
View
view
= View.
inflate
(getApplicationContext(),R.layout.
item
,
null
);
view
.setOnTouchListener(
new
OnTouchListener() {
@Override
public
boolean
onTouch(View
v
, MotionEvent
event
) {
switch
(
event
.getAction()) {
case
MotionEvent.
ACTION_UP
:
Log.
i
(
tag
,
"view MotionEvent.ACTION_UP"
);
break
;
case
MotionEvent.
ACTION_DOWN
:
Log.
i
(
tag
,
"view MotionEvent.ACTION_DOWN"
);
break
;
case
MotionEvent.
ACTION_MOVE
:
Log.
i
(
tag
,
"view MotionEvent.ACTION_MOVE"
);
break
;
case
MotionEvent.
ACTION_CANCEL
:
Log.
i
(
tag
,
"view MotionEvent.ACTION_CANCEL"
);
break
;
}
return
true
;
}
});
container.addView(view);
return view;
}