在有ScrollView Android时检测滑动手势

时间:2014-12-02 13:28:09

标签: java android eclipse

我需要检测我的应用程序何时刷卡,我使用此代码并且工作正常:

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 (getParent() != null) {
                   getParent().requestDisallowInterceptTouchEvent(true);
               }

但我在

上收到错误
  

requestDisallowInterceptTouchEvent

它说我需要添加强制转换为getParent()

1 个答案:

答案 0 :(得分:0)

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

  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);       
    

    }

  4. 注意:不要添加帖子中提到的代码,MIN_DISTANCE有点太小,可能会设置为250。