2010-09-06 30 views
3

我想要偵聽viewFlipper的觸摸事件。我已經能夠在我的活動中監聽觸摸事件,然後修改viewFlipper,但是無論用戶在活動中,都會觸發這些事件,並且我需要專門在viewFlipper上捕獲觸摸事件。我已經嘗試添加setOnTouchListener,但它沒有被調用。我假設viewFlippers兒童(網頁瀏覽)正在'消費'觸摸事件。setOnTouchListener未在ViewFlipper上調用

一個解決方案是將setOnTouchListener設置爲每個Web瀏覽器,但這種感覺像是一種黑客攻擊。有誰知道另一種方式?

感謝,

伊恩

很抱歉,如果這是一個雙崗 - 但我以前的帖子似乎已經消失。

+0

ViewGroup.onInterceptTouchEvent(MotionEvent)怎麼樣? – BeRecursive 2010-09-06 11:25:21

+0

@ user440556:「我假設viewFlippers兒童(網頁瀏覽)正在'消費'觸摸事件。」 - 正確。 – CommonsWare 2010-09-06 11:26:08

+0

因此,使用上述呼叫攔截觸摸事件 – BeRecursive 2010-09-06 11:26:50

回答

4

使用ViewGroup.onInterceptTouchEvent(MotionEvent)

您應該Reference the Android Documentation,因爲它的使用是相當複雜的。

使用的基本總結:

您這裏收到觸摸事件。如果你想消耗它,返回true,並將控制權傳遞給ViewFlipper的onTouchEvent()。返回假,它將繼續傳遞給孩子。 onTouchEvent()也應返回true以確保所有其他事件都返回到ViewFlipper的方法。該小孩還將收到原始事件,並採取行動ACTION_CANCEL

+0

嗨,是的,感謝您的快速反應,但我確實有幾個問題。 a)我沒有擴展viewFlipper,所以我仍然可以使用它? b)這將允許我檢測一個滑動手勢,同時仍然允許子視圖具有滾動功能[我目前可以通過活動dispatchTouchEvent實現此目的] – Yan 2010-09-06 14:58:30

+0

ViewFlipper實現ViewGroup接口,因此無論ViewFlipper可以使用哪些孩子onInterceptTouchEvent。只要你從這個函數返回false,每個下面的事件(直到幷包括最後一個)都將在這裏首先被傳遞,然後被傳遞到目標的onTouchEvent()。 – BeRecursive 2010-09-06 15:11:14

+0

再次感謝,但您的解釋似乎不符合我的問題。顯式地 - 我怎樣才能訪問onInterceptTouchEvent而不擴展viewFlipper(我不想這樣做)? – Yan 2010-09-06 19:00:23

1

我遇到了同樣的問題,並發現你的網頁試圖谷歌的答案。 經過幾次非常令人沮喪的嘗試,我終於找到了一個非常簡單的解決方案,我仍然在聽整個活動的觸摸,就像你一樣,但是在OnTouchEvent I過濾器上,如果ViewFlippers被觸摸或不是:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
     if(mFlip.isInTouchMode()){ 
      return gestureDetector.onTouchEvent(event); 
     } else{ 
      return super.onTouchEvent(event); 
     } 
} 

希望它有幫助!

4

最後它爲我工作。默認情況下返回true以在此偵聽器上獲取多個調用。

viewFlipper.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (this.gestureDetector.onTouchEvent(event)) { 
       return false; 
      } 
      return true; 
     } 
    });