【问题标题】:Detect swipe gesture when there's a ScrollView Android当有 ScrollView Android 时检测滑动手势
【发布时间】:2016-08-16 23:34:11
【问题描述】:

我需要检测我的应用程序何时有滑动,我使用了这段代码,它工作正常:

private float x1,x2;
static final int MIN_DISTANCE = 150;

并覆盖onTouchEvent()方法:

@Override
 public boolean onTouchEvent(MotionEvent event)
 {     
     switch(event.getAction())
     {
       case MotionEvent.ACTION_DOWN:
           x1 = event.getX();                         
       break;         
       case MotionEvent.ACTION_UP:
           x2 = event.getX();
           float deltaX = x2 - x1;
           if (Math.abs(deltaX) > MIN_DISTANCE)
           {
             Toast.makeText(this, "left2right swipe", Toast.LENGTH_SHORT).show ();
           }
           else
           {
               // consider as something else - a screen tap for example
           }                          
       break;   
     }           
     return super.onTouchEvent(event);       
 }

但是,如果我的 Activity 上有一个 scrollView,则代码不再起作用,我该如何解决这个问题?我需要完全更改我正在使用的代码吗?

编辑: 我尝试在检测到滑动手势的 if 中添加以下方法:

if (getParent() != null) {
                   getParent().requestDisallowInterceptTouchEvent(true);
               }

但我收到一个错误

requestDisallowInterceptTouchEvent

它说我需要将演员表添加到 getParent()

【问题讨论】:

  • 检查scrollView是否消耗了MotionEvent...

标签: java android eclipse


【解决方案1】:

是的,你可以解决这个问题 :-) 你需要做 3 件事:

  1. 您需要将此方法添加到您的活动中,这样您可以确保您的 onTouchEvent 函数始终拦截事件:

    @Override
    public boolean dispatchTouchEvent(MotionEvent event){
        this.onTouchEvent(event);
        return super.dispatchTouchEvent(event);
    }
    
  2. 添加一个全局布尔变量作为标志。这是因为当有 ListView 时,super.dispatchTouchEvent 让事件被ListView 消费。但是,当没有ListView时,上面的代码会两次向onTouchEvent发送相同的滑动事件(第二次是通过super.dispatchTouchEvent):

    boolean swapped = false;

  3. 修改您的 onTouchEvent 函数以利用交换的标志:

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {  
     if(swapped){
         /*Make sure you don't swap twice,
    since the dispatchTouchEvent might dispatch your touch event to this function again!*/
         swapped = false;
         return super.onTouchEvent(event);
     }
     switch(event.getAction())
     {
       case MotionEvent.ACTION_DOWN:
           x1 = event.getX();                         
       break;         
       case MotionEvent.ACTION_UP:
           x2 = event.getX();
           float deltaX = x2 - x1;
           if (Math.abs(deltaX) > MIN_DISTANCE)
           {
             Toast.makeText(this, "left2right swipe", Toast.LENGTH_SHORT).show();
             //you already swapped, set flag swapped = true
             swapped = true;
           }
           else
           {
               // not swapping
           }                          
       break;   
     }           
     return super.onTouchEvent(event);       
    

    }

注意:不要添加你在帖子中提到的代码,你的MIN_DISTANCE有点太小了,可以设置为250。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-23
    • 2012-08-28
    • 2017-10-18
    • 2020-01-17
    • 2015-08-25
    • 2016-07-30
    相关资源
    最近更新 更多