记录一下:本来是参考别人自定义viewpager拦截器来实现的,结果用拦截器会出现一系列问题,突然想起有个拦截触摸父布局的方法,抱着试一试的态度结果还真成功了
只需要再移动的时候拦截住父布局,这样滑动冲突就迎刃而解了;
解决这个问题的方法是在适当的地方添加代码来阻止父视图拦截触摸事件。在Android开发中,我们可以使用requestDisallowInterceptTouchEvent(true)方法来实现这一点。这样做将告诉父视图不要拦截触摸事件,以便我们的自定义触摸事件能够正确地处理。
在代码中,只需要在处理gridview的ACTION_MOVE事件的地方添加以下代码拦截其父布局触摸事件来实现即添加
getParent().requestDisallowInterceptTouchEvent(true);
public boolean onTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
//当手指触碰屏幕时,记录下坐标
rawX = (int) ev.getRawX();
rawY = (int) ev.getRawY();
return false;
} else if (isDrag && ev.getAction() == MotionEvent.ACTION_MOVE) {
Log.d("调试", "拖动: ");
getParent().requestDisallowInterceptTouchEvent(true);// 避免滑动冲突
dragParams.x = (int) (ev.getRawX() - dragIiewView.getWidth() / 2);
dragParams.y = (int) (ev.getRawY() - dragIiewView.getHeight() / 2);
//更新窗口显示
windowManager.updateViewLayout(dragIiewView, dragParams);
//获取拖动过程中,触摸点所在GridView中item的位置(position)
int newPos = pointToPosition(((int) ev.getX()), (int) ev.getY());
//如果当前位置不等于上次停留的位置,则交换两次位置的item
if (newPos != AdapterView.INVALID_POSITION && newPos != oldPos) {
((GridViewAdapter) getAdapter()).updataView(oldPos, newPos);
oldPos = newPos;
}
return true;
} else if (isDrag && ev.getAction() == MotionEvent.ACTION_UP) {
Log.d("调试", "松开: ");
//操作停止时(手指离开屏幕),回归正常显示状态
((GridViewAdapter) getAdapter()).showHideView();
//清空窗口
windowManager.removeView(dragIiewView);
//状态改成false
isDrag = false;
return false;
} else if (isDrag && ev.getAction() == MotionEvent.ACTION_CANCEL) {
Log.d("调试", "onTouchEvent: " + ev.getAction());
return true;
} else {
return false;
}
// return super.onTouchEvent(ev);
}