• 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;
        }
    }
  • 相关阅读:
    一个星期自动态的网站设计
    java特权制度设计篇
    mac默认截图、截图代码
    NSDateFormatter
    vlan 以及 Linux实现的IEEE 802.1Q VLAN
    gtk+blade+anjuta 的简单实例
    NetBSD是个开源到源码的系统
    创作gtk源码级vim帮助文档 tags
    linux 怎么使用一个c/c++库
    linux 终端控制-- 多彩输出 格式排版
  • 原文地址:https://www.cnblogs.com/java-g/p/4550924.html
Copyright © 2020-2023  润新知