返回信息流onInterceptTouchEvent(MotionEvent event)里,返回false了,直接运行的话,子View没有响应点击事件。。
但是,如果里面设置了断点,Debug 的时候,子View 又能够响应点击事件。。
困扰好久!!不知道什么情况~~
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #19182同步于 2014/12/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖
很诡异的子View点击事件,不明缘由!!!
zishi
2014/12/24镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
// from com.handmark.pulltorefresh.libraay.PullToRefreshBase
@Override
public final boolean onInterceptTouchEvent(MotionEvent event) {
if (!isPullToRefreshEnabled()) {
return false;
}
final int action = event.getAction();
if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
mIsBeingDragged = false;
return false;
}
if (action != MotionEvent.ACTION_DOWN && mIsBeingDragged) {
return true;
}
switch (action) {
case MotionEvent.ACTION_MOVE: {
// If we're refreshing, and the flag is set. Eat all MOVE events
if (!mScrollingWhileRefreshingEnabled && isRefreshing()) {
return true;
}
if (isReadyForPull()) {
final float y = event.getY(), x = event.getX();
final float diff, oppositeDiff, absDiff;
// We need to use the correct values, based on scroll
// direction
switch (getPullToRefreshScrollDirection()) {
case HORIZONTAL:
diff = x - mLastMotionX;
oppositeDiff = y - mLastMotionY;
break;
case VERTICAL:
default:
diff = y - mLastMotionY;
oppositeDiff = x - mLastMotionX;
break;
}
absDiff = Math.abs(diff);
if (absDiff > mTouchSlop && (!mFilterTouchEvents || absDiff > Math.abs(oppositeDiff))) {
if (mMode.showHeaderLoadingLayout() && diff >= 1f && isReadyForPullStart()) {
mLastMotionY = y;
mLastMotionX = x;
mIsBeingDragged = true;
if (mMode == Mode.BOTH) {
mCurrentMode = Mode.PULL_FROM_START;
}
} else if (mMode.showFooterLoadingLayout() && diff <= -1f && isReadyForPullEnd()) {
mLastMotionY = y;
mLastMotionX = x;
mIsBeingDragged = true;
if (mMode == Mode.BOTH) {
mCurrentMode = Mode.PULL_FROM_END;
}
}
}
}
break;
}
case MotionEvent.ACTION_DOWN: {
if (isReadyForPull()) {
mLastMotionY = mInitialMotionY = event.getY();
mLastMotionX = mInitialMotionX = event.getX();
mIsBeingDragged = false;
}
break;
}
}
return mIsBeingDragged;
}
这是一个上下拉都可以的listview,点击某个item的view的时候,它在这里做了一个拦截,测试,如果没有滑动的话,DOWN和UP返回的都是false,传递给子View了,但是item中的View就是响应不了事件,当我debug在这个函数开头设置断点,然后原先的View就可以正常被点击了。。
【 在 sollian 的大作中提到: 】
: 贴代码
if (action != MotionEvent.ACTION_DOWN && mIsBeingDragged) {
return true;
}
这句有没有问题,如果是move的话,会不会返回true。
感觉整段代码对动作的判断有些乱
目前只有点击事件,所以move返回true逻辑上是ok的。。主要是那个点击事件,有点费解。断点了就可以,不断点就不行。。
【 在 sollian 的大作中提到: 】
: if (action != MotionEvent.ACTION_DOWN && mIsBeingDragged) {
: return true;
: }
: ...................
断点的话。肯定不会滚动。 不断点的话点击的时候是有轻微的滚动的。我的建议是把 dif设置稍微大一点试试看
【 在 zishi 的大作中提到: 】
: 目前只有点击事件,所以move返回true逻辑上是ok的。。主要是那个点击事件,有点费解。断点了就可以,不断点就不行。。