Android 关于判断用户滑动方向
2017-03-22 10:40
162 查看
最近公司遇到一个交互,是对一个控件实现左右滑动以及上下滑动,左右滑动直接用了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; }
相关文章推荐
- android判断viewpager滑动方向
- 判断手指滑动方向 -- Android 学习之路
- Android 判断手势的滑动方向
- 【Android】ListView监听上下滑动(设置滚动监听判断ListView的滚动方向同时获取屏幕高度、ListView实际高度,判断是否需要展示返回顶部按钮(具体逻辑请看代码--附有详细注释)。
- 关于Android用户定位获取location值为null的解决方法
- 关于android读取用户号码,手机串号,SIM卡序列号
- 关于android 摄像头 显示方向
- 【Based Android】Android Sensor感应器介绍(三)获取用户移动方向,指南针原理
- 关于基于android的smack–asmack中注册用户的问题
- 关于Android的横竖屏切换的判断
- android 关于判断scrollView滚动停止
- Android OnGestureListener用法 识别用户手势 左右滑动
- 2012-6-28 Android判断用户是平板还是手机的方法
- android 关于判断scrollView滚动停止
- android 关于 ScrollView嵌套GridView,ListView 显示和滑动的问题
- Android判断用户是平板还是手机的方法
- 【Android笔记 七】Android Sensor感应器介绍(三)获取用户移动方向,指南针原理
- Android OnGestureListener用法 识别用户手势 左右滑动
- 关于android编程使用android.hardware.Camera 方向不对的问题
- android判断用户网络类型