android viewpage解决嵌套

子viewpage 自定义 

写法一:

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;
   }
  
}

写法二 :

public class MyViewPager extends ViewPager {

    public MyViewPager(Context context) {
        super(context);
    }

    public MyViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    PointF downPoint = new PointF();
    OnSingleTouchListener onSingleTouchListener;

    @Override
    public boolean onTouchEvent(MotionEvent evt) {
        switch (evt.getAction()) {
        case MotionEvent.ACTION_DOWN:
            // 记录按下时候的坐标
            downPoint.x = evt.getX();
            downPoint.y = evt.getY();
            if (this.getChildCount() > 1) { //有内容,多于1个时
                // 通知其父控件,现在进行的是本控件的操作,不允许拦截
                getParent().requestDisallowInterceptTouchEvent(true);
            }
            break;
        case MotionEvent.ACTION_MOVE:
            if (this.getChildCount() > 1) { //有内容,多于1个时
                // 通知其父控件,现在进行的是本控件的操作,不允许拦截
                getParent().requestDisallowInterceptTouchEvent(true);
            }
            break;
        case MotionEvent.ACTION_UP:
            // 在up时判断是否按下和松手的坐标为一个点
            if (PointF.length(evt.getX() - downPoint.x, evt.getY()
                    - downPoint.y) < (float) 5.0) {
                onSingleTouch(this);
                return true;
            }
            break;
        }
        return super.onTouchEvent(evt);
    }

    public void onSingleTouch(View v) {
        if (onSingleTouchListener != null) {
            onSingleTouchListener.onSingleTouch(v);
        }
    }

    public interface OnSingleTouchListener {
        public void onSingleTouch(View v);
    }

    public void setOnSingleTouchListener(
            OnSingleTouchListener onSingleTouchListener) {
        this.onSingleTouchListener = onSingleTouchListener;
    }
}

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。