2011-07-06 23 views
5

更新:我弄清楚發生了什麼。看評論。ScaleGestureDetector.OnScaleGestureListener.onScaleEnd()方法未被擊中

我想寫一個ViewSwitcher,它將所有的手勢傳遞給它的第一個孩子,直到它收到一個縮放手勢;然後將它們傳遞給第二個孩子,直到孩子完全縮小,然後再回到第一個孩子。我的子類有一個ScaleGestureDetector和我做了一個非常簡單的監聽器:

protected class OnScaleModeSwitcher implements ScaleGestureDetector.OnScaleGestureListener 
    { 
     protected PageFlipSwitcher owner; 

     public OnScaleModeSwitcher(PageFlipSwitcher newOwner) 
     { 
      super(); 
      owner = newOwner; 
     } 

     @Override 
     public boolean onScale(ScaleGestureDetector detector) { 
      return false; 
     } 

     @Override 
     public boolean onScaleBegin(ScaleGestureDetector detector) { 
      owner.onScaleBegin(); 
//returning false here causes the rest of the gesture to be ignored. 
      return false; 
     } 

     @Override 
     public void onScaleEnd(ScaleGestureDetector detector) { 
      owner.onScaleEnd(); 
     } 
    } 

正如你可以看到它是採取建築所有者對象的引用,然後通過一些事件所有者類中的方法。但是,代碼未能達到onScaleEnd()。

我知道onInterceptTouchEvent可以有點冒險;我儘可能地遵循了Android文檔爲它的建議,並有

@Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) 
    { 
     onTouchEvent(ev); 
     return false; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent ev) 
    { 
//mode is the name of the ScaleGestureDetector 
     mode.onTouchEvent(ev); 

//this code just passes events to the children 
//it seems to work OK 
     if(zoomActive) 
     { 
      //ZoomSwitcher 
      getChildAt(1).onTouchEvent(ev); 
     } 
     else 
     { 
      //Gallery 
      getChildAt(0).onTouchEvent(ev); 
     } 
     return true; 
    } 

我看別的地方,一個GestureDetector可能不會收到ACTION_UP事件:

Android: How to detect when a scroll has ended

那是什麼在這裏發生?如果是這樣的onScaleEnd()方法的重點是什麼?

編輯:

我曾了這一點:那是因爲我的方法返回false。 Eclipse自動實現了一些存根,而我在填充時沒有更改返回值。

回答

7

如果設置從onScaleBegin(...)返回false的ScaleGestureDetector,則後續方法都不會被命中。通常,使用MotionEvent但返回false的方法不會在ACTION_UP(重設偵聽器)之後纔會獲得後續MotionEvents。