解决ScrollView嵌套viewPager中嵌套listView滑动事件冲突问题(水平方向)
2018-03-14 18:36
1401 查看
我们在开发中经常会碰到view滑动冲突的情况。
滑动冲突的解决办法就两种:
1.外部拦截法:是指在点击事件先经过父容器的拦截处理,如果父容器需要处理此事件就进行拦截,如果不需要此事件就不拦截,这样就可以解决滑动冲突的问题,外部拦截法需要重写父容器的onInterceptTouchEvent()方法,在内部做相应拦截处理。
2.内部拦截法:是指点击事件先经过子View处理,如果子view需要次事件就直接消耗掉,否则就交给父容器进行处理,这样就可以解决滑动冲突的问题。内部拦截需要配合requestDisallowInterceptTouchEvent()方法,来确定子view是否允许父容器拦截事件。
a.允许父容器进行事件拦截
getParent().requestDisallowInterceptTouchEvent(false)
b.禁止父容器进行事件拦截
getParent().requestDisallowInterceptTouchEvent(true)
以上是解决滑动冲突的方法,下面我们回到我们今天解决的正题ScrollView嵌套viewPager中嵌套listView滑动事件冲突
这里可以使用第一种解决方案:外部拦截法
只需要自定义一个ScrollView,然后重写它的onInterceptTouchEvent()即可,代码如下:
public class VerticalScrollView extends ScrollView {
private float xDistance, yDistance, xLast, yLast;
public VerticalScrollView(Context context) {
super(context);
}
public VerticalScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public VerticalScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
xDistance = yDistance = 0f;
xLast = ev.getX();
yLast = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
final float curX = ev.getX();
final float curY = ev.getY();
xDistance += Math.abs(curX - xLast);
yDistance += Math.abs(curY - yLast);
xLast = curX;
yLast = curY;
if (xDistance > yDistance) {
return false;
}
}
return super.onInterceptTouchEvent(ev);
}
}
第二种解决方案如下:不需要自定义控件
scrollView.setOnScrollToBottomLintener(new BottomScrollView.OnScrollToBottomListener() {
@Override
public void onScrollBottomListener(boolean isBottom) {
if (isBottom) {
scrollView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
//解决滑动冲突
scrollView.getParent().requestDisallowInterceptTouch
ad9b
Event(false);
break;
}
return false;
}
});
}
}
});
滑动冲突的解决办法就两种:
1.外部拦截法:是指在点击事件先经过父容器的拦截处理,如果父容器需要处理此事件就进行拦截,如果不需要此事件就不拦截,这样就可以解决滑动冲突的问题,外部拦截法需要重写父容器的onInterceptTouchEvent()方法,在内部做相应拦截处理。
2.内部拦截法:是指点击事件先经过子View处理,如果子view需要次事件就直接消耗掉,否则就交给父容器进行处理,这样就可以解决滑动冲突的问题。内部拦截需要配合requestDisallowInterceptTouchEvent()方法,来确定子view是否允许父容器拦截事件。
a.允许父容器进行事件拦截
getParent().requestDisallowInterceptTouchEvent(false)
b.禁止父容器进行事件拦截
getParent().requestDisallowInterceptTouchEvent(true)
以上是解决滑动冲突的方法,下面我们回到我们今天解决的正题ScrollView嵌套viewPager中嵌套listView滑动事件冲突
这里可以使用第一种解决方案:外部拦截法
只需要自定义一个ScrollView,然后重写它的onInterceptTouchEvent()即可,代码如下:
public class VerticalScrollView extends ScrollView {
private float xDistance, yDistance, xLast, yLast;
public VerticalScrollView(Context context) {
super(context);
}
public VerticalScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public VerticalScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
xDistance = yDistance = 0f;
xLast = ev.getX();
yLast = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
final float curX = ev.getX();
final float curY = ev.getY();
xDistance += Math.abs(curX - xLast);
yDistance += Math.abs(curY - yLast);
xLast = curX;
yLast = curY;
if (xDistance > yDistance) {
return false;
}
}
return super.onInterceptTouchEvent(ev);
}
}
第二种解决方案如下:不需要自定义控件
scrollView.setOnScrollToBottomLintener(new BottomScrollView.OnScrollToBottomListener() {
@Override
public void onScrollBottomListener(boolean isBottom) {
if (isBottom) {
scrollView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
//解决滑动冲突
scrollView.getParent().requestDisallowInterceptTouch
ad9b
Event(false);
break;
}
return false;
}
});
}
}
});
相关文章推荐
- 解决ScrollView嵌套viewpager滑动事件冲突问题
- 简单完美解决PullToRefreshLayout中PullableListView嵌套ViewPager时滑动冲突的问题
- 解决ScrollView嵌套ViewPager出现的滑动冲突问题
- 解决在scrollview上下滑动嵌套scrollview,viewpager水平滑动时的抖动问题
- 解决ScrollView和VerticalViewPager滑动事件冲突问题
- 解决ScrollView嵌套ViewPager出现的滑动冲突问题
- Android ScrollView嵌套ViewPager滑动失效和无法正常滑动冲突问题解决方案
- Android中解决ListView嵌套Viewpager时,滑动事件冲突的方法
- 完美解决ScrollView嵌套ViewPager滑动失效和无法正常滑动冲突问题
- 完美解决ScrollView嵌套ViewPager滑动失效和无法正常滑动冲突问题
- 解决在scrollview上下滑动嵌套scrollview,viewpager水平滑动时问题
- 解决ListView+ViewPager滑动事件冲突的问题
- 解决ScrollView嵌套ViewPager出现的滑动冲突问题
- 完美解决Android里面scrollview嵌套及listview嵌套viewpager的滑动冲突问题的简单方法
- 解决ListView+ViewPager滑动事件冲突的问题
- 解决在scrollview上下滑动嵌套scrollview,viewpager水平滑动时的抖动问题
- 安卓解决viewPager和scrollView和listView滑动冲突的问题
- Android中解决ListView嵌套Viewpager时,滑动事件冲突的方法
- android scrollView 内嵌ViewPager或Gallery等水平滑动控件冲突问题解决实现同时滑动
- 解决ScrollView嵌套ViewPager出现的滑动冲突问题