ScrollView和ViewPager嵌套使用(导致左右、上下滑动冲突解决方案)
2016-09-08 15:29
531 查看
前言:解决ScrollView中嵌套ViewPager,导致焦点冲突,解决的方案都是根据事件分发的原理设计的。
方案1:自定义Viewpager做为子控件
方案2:重写ScrollView的onInterceptTouchEvent()回调函数,需要在程序里新加一个ScrollViewExtend类并继承自ScrollView,下面是其代码:
以上就是全部代码,大家可以自个去试试,有什么问题可以留言。或者在微信公众号“技术帮团队”上找我们。
方案1:自定义Viewpager做为子控件
public class ChildViewPager extends ViewPager{ /** 触摸时按下的点 **/ PointF downP = new PointF(); /** 触摸时当前的点 **/ PointF curP = new PointF(); OnSingleTouchListener onSingleTouchListener; public ChildViewPager(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } public ChildViewPager(Context context) { super(context); // TODO Auto-generated constructor stub } @Override public boolean onInterceptTouchEvent(MotionEvent arg0) { // TODO Auto-generated method stub //当拦截触摸事件到达此位置的时候,返回true, //说明将onTouch拦截在此控件,进而执行此控件的onTouchEvent return true; } @Override public boolean onTouchEvent(MotionEvent arg0) { // TODO Auto-generated method stub //每次进行onTouch事件都记录当前的按下的坐标 curP.x = arg0.getX(); curP.y = arg0.getY(); if(arg0.getAction() == MotionEvent.ACTION_DOWN){ //记录按下时候的坐标 //切记不可用 downP = curP ,这样在改变curP的时候,downP也会改变 downP.x = arg0.getX(); downP.y = arg0.getY(); //此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰 getParent().requestDisallowInterceptTouchEvent(true); } if(arg0.getAction() == MotionEvent.ACTION_MOVE){ //此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰 getParent().requestDisallowInterceptTouchEvent(true); } if(arg0.getAction() == MotionEvent.ACTION_UP){ //在up时判断是否按下和松手的坐标为一个点 //如果是一个点,将执行点击事件,这是我自己写的点击事件,而不是onclick if(downP.x==curP.x && downP.y==curP.y){ onSingleTouch(); return true; } } return super.onTouchEvent(arg0); } /** * 单击 */ public void onSingleTouch() { if (onSingleTouchListener!= null) { onSingleTouchListener.onSingleTouch(); } } /** * 创建点击事件接口 * @author wanpg * */ public interface OnSingleTouchListener { public void onSingleTouch(); } public void setOnSingleTouchListener(OnSingleTouchListener onSingleTouchListener) { this.onSingleTouchListener = onSingleTouchListener; } }
方案2:重写ScrollView的onInterceptTouchEvent()回调函数,需要在程序里新加一个ScrollViewExtend类并继承自ScrollView,下面是其代码:
public class ScrollViewExtend extends ScrollView { // 滑动距离及坐标 private float xDistance, yDistance, xLast, yLast; public ScrollViewExtend(Context context, AttributeSet attrs) { super(context, attrs); } @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中包含viewpager导致viewpager左右滑动手势不灵敏的解决方案
- android嵌套使用ViewPager和ScrollView焦点冲突解决方案
- 使用viewpager嵌套实现上下左右滑动切换图片(IOS双向滚动翻页效果相同)
- android嵌套使用ViewPager和ScrollView焦点冲突解决方案
- ScrollView嵌套ViewPager空白,上下或者左右不能滑动问题
- android ViewPager嵌套使用的滑动冲突解决方案,优先让里层的ViewPager滑动完毕后外层的ViewPager再滑动
- ScrollView嵌套ViewPager引起的滑动冲突的解决方案
- Android ScrollView与ViewPager滑动上下左右冲突
- 使用viewpager嵌套实现上下左右滑动切换图片
- 使用viewpager嵌套实现上下左右滑动切换图片(IOS双向滚动翻页效果相同)
- 解决ScrollView嵌套ViewPager出现的滑动冲突问题
- 解决ScrollView嵌套ViewPager出现的滑动冲突问题
- ScrollView嵌套ViewPager 时候 Pager左右滑动不流畅
- Android ViewPager、ScrollView或ListView嵌套WebView滑动冲突
- ViewPager,ScrollView 嵌套ViewPager滑动冲突解决
- 完美解决ScrollView嵌套ViewPager滑动失效和无法正常滑动冲突问题
- 解决ScrollView嵌套viewpager滑动事件冲突问题
- 完美解决ScrollView嵌套ViewPager滑动失效和无法正常滑动冲突问题
- ScrollView中嵌套的viewPager,viepager高度设置为wrap_content时内容不显示问题以及与scrollview冲突的解决方案
- 解决ScrollView嵌套ViewPager出现的滑动冲突问题