ScrollView ViewPager嵌套导致滑动冲突解决方案

来源:互联网 发布:淘宝网上书店首页 编辑:程序博客网 时间:2024/05/16 00:49
解决方案1:

自定义Viewpager做为子控件

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. public class ChildViewPager extends ViewPager{  
  2.     /** 触摸时按下的点 **/  
  3.     PointF downP = new PointF();  
  4.     /** 触摸时当前的点 **/  
  5.     PointF curP = new PointF();   
  6.     OnSingleTouchListener onSingleTouchListener;  
  7.   
  8.     public ChildViewPager(Context context, AttributeSet attrs) {  
  9.         super(context, attrs);  
  10.         // TODO Auto-generated constructor stub  
  11.     }  
  12.   
  13.     public ChildViewPager(Context context) {  
  14.         super(context);  
  15.         // TODO Auto-generated constructor stub  
  16.     }  
  17.   
  18.     @Override  
  19.     public boolean onInterceptTouchEvent(MotionEvent arg0) {  
  20.         // TODO Auto-generated method stub  
  21.         //当拦截触摸事件到达此位置的时候,返回true,  
  22.         //说明将onTouch拦截在此控件,进而执行此控件的onTouchEvent  
  23.         return true;  
  24.     }  
  25.   
  26.     @Override  
  27.     public boolean onTouchEvent(MotionEvent arg0) {  
  28.         // TODO Auto-generated method stub  
  29.         //每次进行onTouch事件都记录当前的按下的坐标  
  30.         curP.x = arg0.getX();  
  31.         curP.y = arg0.getY();  
  32.   
  33.         if(arg0.getAction() == MotionEvent.ACTION_DOWN){  
  34.             //记录按下时候的坐标  
  35.             //切记不可用 downP = curP ,这样在改变curP的时候,downP也会改变  
  36.             downP.x = arg0.getX();  
  37.             downP.y = arg0.getY();  
  38.             //此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰  
  39.             getParent().requestDisallowInterceptTouchEvent(true);  
  40.         }  
  41.   
  42.         if(arg0.getAction() == MotionEvent.ACTION_MOVE){  
  43.             //此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰  
  44.             getParent().requestDisallowInterceptTouchEvent(true);  
  45.         }  
  46.   
  47.         if(arg0.getAction() == MotionEvent.ACTION_UP){  
  48.             //在up时判断是否按下和松手的坐标为一个点  
  49.             //如果是一个点,将执行点击事件,这是我自己写的点击事件,而不是onclick  
  50.             if(downP.x==curP.x && downP.y==curP.y){  
  51.                 onSingleTouch();  
  52.                 return true;  
  53.             }  
  54.         }  
  55.   
  56.         return super.onTouchEvent(arg0);  
  57.     }  
  58.   
  59.         /** 
  60.      * 单击 
  61.      */  
  62.     public void onSingleTouch() {  
  63.         if (onSingleTouchListener!= null) {  
  64.   
  65.             onSingleTouchListener.onSingleTouch();  
  66.         }  
  67.     }  
  68.   
  69.     /** 
  70.      * 创建点击事件接口 
  71.      * @author wanpg 
  72.      * 
  73.      */  
  74.     public interface OnSingleTouchListener {  
  75.         public void onSingleTouch();  
  76.     }  
  77.   
  78.     public void setOnSingleTouchListener(OnSingleTouchListener onSingleTouchListener) {  
  79.         this.onSingleTouchListener = onSingleTouchListener;  
  80.     }  
  81.   
  82. }  

解决方案2:

重写ScrollView的onInterceptTouchEvent()回调函数。需要在程序里新加一个ScrollViewExtend类并继承自ScrollView,下面是其代码:

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. package com.image.indicator.control;  
  2.   
  3. import android.content.Context;  
  4. import android.util.AttributeSet;  
  5. import android.view.MotionEvent;  
  6. import android.widget.ScrollView;  
  7.   
  8. /** 
  9.  * 能够兼容ViewPager的ScrollView 
  10.  * @Description: 解决了ViewPager在ScrollView中的滑动反弹问题 
  11.  
  12.  * @File: ScrollViewExtend.java 
  13.  
  14.  * @Package com.image.indicator.control 
  15.  
  16.  * @Author Hanyonglu 
  17.  
  18.  * @Date 2012-6-18 下午01:34:50 
  19.  
  20.  * @Version V1.0 
  21.  */  
  22. public class ScrollViewExtend extends ScrollView {  
  23.     // 滑动距离及坐标  
  24.     private float xDistance, yDistance, xLast, yLast;  
  25.   
  26.     public ScrollViewExtend(Context context, AttributeSet attrs) {  
  27.         super(context, attrs);  
  28.     }  
  29.   
  30.     @Override  
  31.     public boolean onInterceptTouchEvent(MotionEvent ev) {  
  32.         switch (ev.getAction()) {  
  33.             case MotionEvent.ACTION_DOWN:  
  34.                 xDistance = yDistance = 0f;  
  35.                 xLast = ev.getX();  
  36.                 yLast = ev.getY();  
  37.                 break;  
  38.             case MotionEvent.ACTION_MOVE:  
  39.                 final float curX = ev.getX();  
  40.                 final float curY = ev.getY();  
  41.   
  42.                 xDistance += Math.abs(curX - xLast);  
  43.                 yDistance += Math.abs(curY - yLast);  
  44.                 xLast = curX;  
  45.                 yLast = curY;  
  46.   
  47.                 if(xDistance > yDistance){  
  48.                     return false;  
  49.                 }    
  50.         }  
  51.   
  52.         return super.onInterceptTouchEvent(ev);  
  53.     }  
  54. }  
0 0
原创粉丝点击