zoukankan      html  css  js  c++  java
  • viewPager双层嵌套的事件问题

    问题描述:  ViewPager嵌套viewPager, 当childViewPager中加入了Onclick事件, 导致childViewpager的滑动消息被拦截掉。

    很无奈。 

    解决方法: 重写childviewPager, 拦截消息转发.

    public class ChildViewPager extends ViewPager {
        /** 触摸时按下的点 **/
        PointF downP = new PointF();
        /** 触摸时当前的点 **/
        PointF curP = new PointF();
        OnSingleTouchListener onSingleTouchListener;
    
        public ChildViewPager(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public ChildViewPager(Context context) {
            super(context);
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent arg0) {
            // 当拦截触摸事件到达此位置的时候,返回true,
            // 说明将onTouch拦截在此控件,进而执行此控件的onTouchEvent
            return true;
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent arg0) {
            // 每次进行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();
            }
        }
    
        /**
         * 创建点击事件接口
         */
        public interface OnSingleTouchListener {
            public void onSingleTouch();
        }
    
        public void setOnSingleTouchListener(OnSingleTouchListener onSingleTouchListener) {
            this.onSingleTouchListener = onSingleTouchListener;
        }
    
    }
  • 相关阅读:
    为了实现在线库的复杂查询,你还在双写吗?
    双11核心系统100%上云 !阿里数据库处理峰值远超传统厂商
    每秒8700万次!双11数据库峰值新纪录背后的关键力量
    最强CP!阿里云联手支付宝小程序如何助力双11?
    .net IAsyncResult 异步操作
    .net Reflection(反射)- 二
    .net Reflection(反射)- 一
    .net 空接合操作符 ??
    .net 基元类型,引用类型和值类型
    .net List<T>
  • 原文地址:https://www.cnblogs.com/xitang/p/3179649.html
Copyright © 2011-2022 走看看