主要通过重写 onInterceptTouchEvent 事件来解决,代码如下:

  1. package com.cm.android.pad.view.itemView;
  2. import android.content.Context;
  3. import android.util.AttributeSet;
  4. import android.util.DisplayMetrics;
  5. import android.util.Log;
  6. import android.view.MotionEvent;
  7. import android.view.VelocityTracker;
  8. import android.view.ViewConfiguration;
  9. import android.view.WindowManager;
  10. import android.widget.ScrollView;
  11. import android.widget.Scroller;
  12. public class MultiScroll extends ScrollView {
  13. private static final int ANIMATION_SCREEN_SET_DURATION_MILLIS = 500;
  14. // What fraction (1/x) of the screen the user must swipe to indicate a page change
  15. private static final int FRACTION_OF_SCREEN_WIDTH_FOR_SWIPE = 4;
  16. private static final int INVALID_SCREEN = -1;
  17. /*
  18. * Velocity of a swipe (in density-independent pixels per second) to force a swipe to the
  19. * next/previous screen. Adjusted into mDensityAdjustedSnapVelocity on init.
  20. */
  21. private static final int SNAP_VELOCITY_DIP_PER_SECOND = 600;
  22. // Argument to getVelocity for units to give pixels per second (1 = pixels per millisecond).
  23. private static final int VELOCITY_UNIT_PIXELS_PER_SECOND = 1000;
  24. private static final int TOUCH_STATE_REST = 0;
  25. private static final int TOUCH_STATE_HORIZONTAL_SCROLLING = 1;
  26. private static final int TOUCH_STATE_VERTICAL_SCROLLING = -1;
  27. private int mCurrentScreen;
  28. private int mDensityAdjustedSnapVelocity;
  29. private boolean mFirstLayout = true;
  30. private float mLastMotionX;
  31. private float mLastMotionY;
  32. //private OnScreenSwitchListener mOnScreenSwitchListener;
  33. private int mMaximumVelocity;
  34. private int mNextScreen = INVALID_SCREEN;
  35. private Scroller mScroller;
  36. private int mTouchSlop;
  37. private int mTouchState = TOUCH_STATE_REST;
  38. private VelocityTracker mVelocityTracker;
  39. private int mLastSeenLayoutWidth = -1;
  40. public MultiScroll(Context context) {
  41. super(context);
  42. init();
  43. }
  44. public MultiScroll(Context context, AttributeSet attrs, int defStyle) {
  45. super(context, attrs, defStyle);
  46. init();
  47. }
  48. public MultiScroll(Context context, AttributeSet attrs) {
  49. super(context, attrs);
  50. init();
  51. }
  52. private void init() {
  53. mScroller = new Scroller(getContext());
  54. // Calculate the density-dependent snap velocity in pixels
  55. DisplayMetrics displayMetrics = new DisplayMetrics();
  56. ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay()
  57. .getMetrics(displayMetrics);
  58. mDensityAdjustedSnapVelocity =
  59. (int) (displayMetrics.density * SNAP_VELOCITY_DIP_PER_SECOND);
  60. final ViewConfiguration configuration = ViewConfiguration.get(getContext());
  61. mTouchSlop = configuration.getScaledTouchSlop();
  62. mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
  63. }
  64. @Override
  65. public boolean onInterceptTouchEvent(final MotionEvent ev) {
  66. /*
  67. * By Yoni Samlan: Modified onInterceptTouchEvent based on standard ScrollView's
  68. * onIntercept. The logic is designed to support a nested vertically scrolling view inside
  69. * this one; once a scroll registers for X-wise scrolling, handle it in this view and don't
  70. * let the children, but once a scroll registers for y-wise scrolling, let the children
  71. * handle it exclusively.
  72. */
  73. final int action = ev.getAction();
  74. boolean intercept = false;
  75. switch (action) {
  76. case MotionEvent.ACTION_MOVE:
  77. /*
  78. * If we're in a horizontal scroll event, take it (intercept further events). But if
  79. * we're mid-vertical-scroll, don't even try; let the children deal with it. If we
  80. * haven't found a scroll event yet, check for one.
  81. */
  82. if (mTouchState == TOUCH_STATE_HORIZONTAL_SCROLLING) {
  83. // Let children handle the events for the duration of the scroll event.
  84. intercept = false;
  85. } else if (mTouchState == TOUCH_STATE_VERTICAL_SCROLLING) {
  86. /*
  87. * We've already started a horizontal scroll; set intercept to true so we can
  88. * take the remainder of all touch events in onTouchEvent.
  89. */
  90. intercept = true;
  91. } else { // We haven't picked up a scroll event yet; check for one.
  92. /*
  93. * If we detected a horizontal scroll event, start stealing touch events (mark
  94. * as scrolling). Otherwise, see if we had a vertical scroll event -- if so, let
  95. * the children handle it and don't look to intercept again until the motion is
  96. * done.
  97. */
  98. final float x = ev.getX();
  99. final int xDiff = (int) Math.abs(x - mLastMotionX);
  100. boolean xMoved = xDiff > mTouchSlop;
  101. final float y = ev.getY();
  102. final int yDiff = (int) Math.abs(y - mLastMotionY);
  103. boolean yMoved = yDiff > mTouchSlop;
  104. if (xMoved) {
  105. // Scroll if the user moved far enough along the X axis
  106. if(xDiff>=yDiff)
  107. mTouchState = TOUCH_STATE_HORIZONTAL_SCROLLING;
  108. mLastMotionX = x;
  109. }
  110. if (yMoved) {
  111. if(yDiff>xDiff)
  112. mTouchState = TOUCH_STATE_VERTICAL_SCROLLING;
  113. mLastMotionY = y;
  114. }
  115. }
  116. break;
  117. case MotionEvent.ACTION_CANCEL:
  118. case MotionEvent.ACTION_UP:
  119. // Release the drag.
  120. mTouchState = TOUCH_STATE_REST;
  121. intercept = false;
  122. break;
  123. case MotionEvent.ACTION_DOWN:
  124. /*
  125. * No motion yet, but register the coordinates so we can check for intercept at the
  126. * next MOVE event.
  127. */
  128. //Log.i("ViewPager-->", "Action_Down");
  129. mTouchState = TOUCH_STATE_REST;
  130. mLastMotionY = ev.getY();
  131. mLastMotionX = ev.getX();
  132. break;
  133. default:
  134. break;
  135. }
  136. Log.i("MultiScroll-->", intercept+"");
  137. return intercept;
  138. }
  139. }

Android开发ScrollView上下左右滑动事件冲突整理一(根据事件)的更多相关文章

  1. Android开发之手势滑动(滑动手势监听)详解

    Android开发之手势滑动(滑动手势监听)详解 在Android应用中,经常需要手势滑动操作,比如上下滑动,或左右方向滑动,处理手势滑动通常有两种方法:一种是单独实现setOnTouchListen ...

  2. Android 自定义ScrollView的滑动监听事件

    项目结构: 1.LazyScrollView类(自定义ScrollView) package android.zhh.com.myapplicationscrollview; /** * Create ...

  3. Android开发之源码:多次点击事件的原理和实现

    多次点击事件 多次点击事件原理:最后一次点击事件与第一次点击事件的时间间隔是否小于某个时间,当小于的时候,就认为这是一个多次点击事件. Android源码实现效果: import android.ap ...

  4. android 开发 ScrollView 控件的一些api描述与自定义ScrollView接口回调方法

    1.正常使用ScrollView控件的一些api详解. package com.example.lenovo.mydemoapp.scrollViewDemo; import android.supp ...

  5. JS 事件冒泡整理 浏览器的事件流

    JavaScript与HTML的交互通过事件来实现.而浏览器的事件流是一个非常重要的概念.不去讨论那些古老的浏览器有事件捕获与事件冒泡的争议, 只需要知道在DOM2中规定的事件流包括了三个部分,事件捕 ...

  6. Android开发(十九)——ViewFlipper中的onClick事件和onFling事件冲突

    在onDown中设置this.flipper.setClickable(true); 然后在onFling方法中this.flipper.setClickable(false); ps: 其中setO ...

  7. Android监测手指上下左右滑动屏幕

    在开发android程序时,有时会需要监测手指滑动屏幕,当手指朝上下左右不同方向滑动时做出不同的响应,那怎么去实现呢? 利用Android提供的手势监测器就可以很方便的实现,直接上代码(已测试通过) ...

  8. android开发学习 ------- 自定义View 圆 ,其点击事件 及 确定当前view的层级关系

    我需要实现下面的效果:   参考文章:https://blog.csdn.net/halaoda/article/details/78177069 涉及的View事件分发机制 https://www. ...

  9. Android开发--ScrollView的应用

    1.简介 当内容无法全部显示时,需要采取滚动的方式获取其与内容.其中,ScrollView为垂直滚动控件,HorizontalScrollView为水平滚动控件. 2.构建

随机推荐

  1. php框架练习

    框架的作用: 功能:操作数据库 模版引擎smarty 分析,应该具备什么功能? a:具体配置文件 ,配置文件的读取功能 b:数据库处理类 c:目录结构 先建一个includes文件放入,配置文件(co ...

  2. 搞Solr这一年(本人QQ 282335345 群412268049 欢迎大家一起学习Solr 非诚勿扰)

    搞Solr这一年 去年6月份毕业到现在已经快一年半了,很庆幸从事了搜索引擎这份工作,虽然谈不上有多深入,但至少已经入门了.在这一年半里,搞了3个月的hbase和mapreduce,搞了一个月的nutc ...

  3. VmWare问题解决(网络变更后虚拟主机无法上网)

    安装 Vmware,并新建一个虚拟机后,当时做好配置(NAT模式)后,虚拟机能够正常上网. 然后将电脑带到另一个地理位置办公时,却无法上网. 本篇探讨问题的缘由和几种解决方式. 一.缘由解析 仅探讨上 ...

  4. Java中的移位操作符

    记住所有的移动位数,针对的都是补码来讲的,所以要先将十进制整数转换成补码后,然后再来进行移位操作 移位操作 还要注意类型的约束条件,例如int,移动范围是0-31位,所以看补码只能看最后五位,这才是有 ...

  5. dwr消息推送和tomcat集群

    网友的提问: 项目中用到了dwr消息推送.而服务端是通过一个http请求后 触发dwr中的推送方法.而单个tomcat中.服务器发送的http请求和用户都在一个tomcat服务器中.这样就能精准推送到 ...

  6. 【HDOJ】3451 Beat drop

    BFS.当水滴破裂飞溅后,直到碰到水滴才会停止(观察case1).同时,考虑当水滴飞溅到点(x,y)并且该点同一时间破裂的情况,该水滴算作吸收. /* 3451 */ #include <ios ...

  7. BZOJ 1093 [ZJOI2007]最大半连通子图

    1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1986  Solved: 802[Submit][St ...

  8. zoj3229 Shoot the Bullet(有源汇有上下界的最大流)

    题意: 一个屌丝给m个女神拍照,计划拍照n天,每一天屌丝给给定的C个女神拍照,每天拍照数不能超过D张,而且给每个女神i拍照有数量限制[Li,Ri],对于每个女神n天的拍照总和不能少于Gi,如果有解求屌 ...

  9. 数学(错排):BZOJ 4517: [Sdoi2016]排列计数

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 693  Solved: 434[Submit][Status ...

  10. poj3186 Treats for the Cows

    http://poj.org/problem?id=3186 Treats for the Cows Time Limit: 1000MS   Memory Limit: 65536K Total S ...