zoukankan      html  css  js  c++  java
  • Android滑动事件冲突

    首先,我们假设这样一个场景:一个ViewPager里面嵌套一个ViewPager,内部滑动方向和外部滑动方向一样时,该怎么解决这一冲突呢? 
    针对滑动冲突这里给出两种解决方案:外部拦截法,内部拦截法。

    外部拦截法

    情景:一个ViewPager嵌套了一个Listview,一个是左右滑动,一个上下滑动。这个时候我们可以用外部拦截法,来处理冲突。在父容器ViewPager中,重写onInterceptTouchEvent()方法,判断当左右滑动时就拦截事件,上下滑动就不拦截,将事件交由子元素Listview来处理。首先我们需要重写一个ViewPager,叫MyViewPager,然后重写onInterceptTouchEvent()方法。具体代码如下:

     1 public class MyViewPager extends ViewPager {
     2     private int startX;
     3     private int startY;
     4     public MyViewPager(Context context) {
     5         super(context);
     6     }
     7 
     8 
     9     @Override
    10     public boolean onInterceptTouchEvent(MotionEvent ev) {
    11         switch (ev.getAction())
    12         {
    13             case MotionEvent.ACTION_DOWN:
    14                 startX= (int) ev.getX();
    15                 startY= (int) ev.getY();
    16                 break;
    17             case MotionEvent.ACTION_MOVE:
    18 
    19                 int dX= (int) (ev.getX()-startX);
    20                 int dY= (int) (ev.getY()-startX);
    21                 if(Math.abs(dX)>Math.abs(dY)){//左右滑动
    22                     return true;
    23                 }else {//上下滑动
    24                     return false;
    25                 }
    26             case MotionEvent.ACTION_UP:
    27                 break;
    28         }
    29         return super.onInterceptTouchEvent(ev);
    30     }
    31 }

    这样就解决这种情况下的滑动冲突, 程序演示入下图: 

    上述代码是外部拦截的典型逻辑,只需要重写onInterceptTouchEvent()方法,修改父容器当前需要的事件即可。

    内部拦截法

    情景:一个ViewPager嵌套了一个ViewPager,两个都是左右滑动。这个时候我们可以用内部拦截法,来处理冲突。即重写子元素的dispatchTouchEvent()方法,并调用getParent().requestDisallowInterceptTouchEvent(true)是父容器不能拦截子元素需要的事件。下面来看具体代码:

     1 public boolean dispatchTouchEvent(MotionEvent event) {
     2         ...
     3 
     4         switch (action) {
     5             case MotionEvent.ACTION_MOVE:
     6                         getParent().requestDisallowInterceptTouchEvent(true);
     7 
     8                 break;
     9             case MotionEvent.ACTION_MOVE:
    10                 if(子元素需要处理此事件)
    11                             getParent().requestDisallowInterceptTouchEvent(true);
    12 
    13                 break;
    14             case MotionEvent.ACTION_UP: {
    15                 break;
    16         }
    17         ...
    18         return super.dispatchTouchEvent(event);
    19 ;
    20     }

    当然,还需要修改父容器的onInterceptTouchEvent()方法,代码如下:

     1 @Override
     2     public boolean onInterceptTouchEvent(MotionEvent ev) {
     3 
     4             int action=ev.getAction();
     5             if(action==MotionEvent.ACTION_DOWN){
     6                 return false;
     7             }else {
     8                 return true;
     9             }
    10         }

    运行结果如图:

    以上就是两种解决滑动冲突的解决方案。

  • 相关阅读:
    JavaScript实现上传图片预览[js前端实现]
    Java内存Happen-Before
    《干净架构读书笔记》——业务驱动编程
    《干净架构读书笔记》——编程范式
    Scrum中的冲刺和迭代
    Spring Cloud中通过Kafka传递自定义Header
    领域驱动开发(DDD)Web开发中的典型分层
    给开发团队减减负
    业务实体和用例
    什么是好的代码-代码Review要点
  • 原文地址:https://www.cnblogs.com/yxx123/p/5250101.html
Copyright © 2011-2022 走看看