Android 关于判断用户滑动方向

最近公司遇到一个交互,是对一个控件实现左右滑动以及上下滑动,左右滑动直接用了ViewPager,但是此时遇到一个问题,就是不知道用户是进行左右还是上下的操作。百度查了好多,都是在UP的时候进行判断,但是这样就做不到交互了,于是自己写了一个代码如下(完整代码就不贴了,因为没有写一个Demo,是直接在公司项目中写的):


效果图如下:


/**
     * 默认是上下滑动
     * true:上下滑动
     * false:左右滑动
     */
    boolean slide = true;
    private float translationY;
    private float dy;
    float stratY;
    float downY;
    float downX;
    boolean hasMoved = false;// 判断视图是否被移动
    int xToMove;// 视图所要被移动的距离,默认200
    float dx;
    /**
     * 是否决定什么滑动若不决定则不做操作
     */
    boolean direction = false;


    private void setListener() {
        rcv_transit_path_planninng_list_detail.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                return false;
            }
        });
        ll_item_transit_path_planning_map_parent.setOnTouchListener(
                new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View view, MotionEvent motionEvent) {
                        //判断用户滑动方向
                        View parent = (View) view.getParent();
                        switch (motionEvent.getAction()) {
                            case MotionEvent.ACTION_DOWN:
                                ll_item_transit_path_planning_map_parent.getViewPager().dispatchTouchEvent(motionEvent);
                                stratY = motionEvent.getRawY();
                                downY = motionEvent.getY();
                                downX = motionEvent.getX();
                                if (hasMoved) {
                                    stratY = stratY - xToMove;
                                } else {
                                    view.onTouchEvent(motionEvent);// 当视图没有被移动,返回事件,使点击事件可用。
                                }

                                break;
                            case MotionEvent.ACTION_MOVE:
                                float moveY = motionEvent.getRawY();
                                float deltaY = moveY - stratY;

                                dy = motionEvent.getY() - downY;
                                dx = motionEvent.getX() - downX;

                                translationY = parent.getTranslationY();
                                int translationEndY = screenHeight - DrawUtil.dip2px(getContext(), 207);

                                Log.e("TAG", dx + "===dx");
                                Log.e("TAG", dy + "===dy");

                                if (!direction) {
                                    direction = judgeDirection();
                                } else {
                                    if (direction && !slide) {
                                        //进入后代表已经确定滑动方向为左右滑动
                                        ll_item_transit_path_planning_map_parent.getViewPager().dispatchTouchEvent(motionEvent);
                                    } else {
                                        //进入后代表已经确定滑动方向 上下滑动
                                        if (dy > 0) {
                                            //下移
                                            if (translationY <= translationEndY) {
                                                setTranslationY(parent, deltaY);
                                            }
                                        } else {
                                            //上移
                                            if (translationY >= DrawUtil.dip2px(getContext(), 5)) {
                                                setTranslationY(parent, deltaY);
                                            }
                                        }
                                    }
                                }

                                break;
                            case MotionEvent.ACTION_UP:

                                if (direction && !slide) {
                                    //进入后代表已经确定滑动方向为左右滑动
                                    ll_item_transit_path_planning_map_parent.getViewPager().dispatchTouchEvent(motionEvent);
                                } else {
                                    deltaY = motionEvent.getRawY() - stratY;
                                    int height = sv_transit_path_planning_map.getHeight() - DrawUtil.dip2px(getContext(), 140);
                                    boolean swap = false;
                                    Log.e("TAG", deltaY + "=deltaY");
                                    Log.e("TAG", height + "=height");

                                    if ((deltaY < (height / 2) && hasMoved)
                                            || (deltaY > (height / 2) && !hasMoved)) {
                                        swap = true;
                                    }

                                    if (swap) {
                                        if (!hasMoved) {
                                            generateRevealAnimate(parent, xToMove);
                                            hasMoved = true;
                                        } else {
                                            generateRevealAnimate(parent, 0);
                                            hasMoved = false;
                                        }
                                    } else {
                                        if (hasMoved) {
                                            generateRevealAnimate(parent, xToMove);
                                        } else {
                                            generateRevealAnimate(parent, 0);
                                        }
                                    }
                                }

                                slide = true;
                                direction = false;

                                break;
                        }


                        return true;
                    }
                });
    }

    /**
     * 判断用户滑动方向
     *
     * @return
     */
    private boolean judgeDirection() {

        if ((Math.abs(dx) - Math.abs(dy)) > 50) {
            //左右滑动
            slide = false;
            return true;
        } else if ((Math.abs(dy) - Math.abs(dx)) > 50) {
            //上下滑动
            slide = true;
            return true;
        }
        return false;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值