2012-08-28 72 views
18

我試着瞭解Android如何處理觸摸事件,並且有點困惑。從我所瞭解的觸摸事件發送到根視圖並傳遞給孩子。 我有一個FrameLayout這是一個容器Fragment。 第一個片段視圖是ScrollView,第二個是某種Gallery(Horizo​​ntalListView),最後一個也是FrameLayout。每次佈局中只有一個片段。 我想要做的是識別屏幕上的用戶滑動,以供應用程序使用。我想數一些滑動操作,然後在一些滑動操作之後做一些事情。父母抓住onTouch事件,處理它並傳遞給兒童

我試圖把OnTouchListener放在頂部FrameLayout,但當孩子是ScrollViewGallery時它不會被調用。我試圖在onTouch的末尾返回falsetrue,但我得到了相同的結果 - 它從未被調用。

我該怎麼辦? 我只是想「透明地」處理觸摸事件並將它們傳遞給我,就像我甚至沒有觸碰它們一樣。

回答

22

我的理解是,它實際上走向了另一個方向。子視圖首先觸發它們的事件(有點)。根視圖得到它的調用dispatchTouchEvent(),它將事件傳播到子對象onTouchEvent(),然後,根據它們是否返回true或false,調用父對象onTouchEvent()

攔截這樣的事情,正常的解決方案是重寫dispatchTouchEvent(MotionEvent ev)於一體的活動,像這樣:

@Override 
public boolean dispatchTouchEvent (MotionEvent ev) { 
    // Do your calcluations 
    return super.dispatchTouchEvent(ev); 
} 

這一項的文檔here。請注意,您也可以在任何ViewGroup(例如FrameLayout等)中覆蓋該方法。

+0

它工作正常!我擴展了'FrameLayout',覆蓋了你提到的方法,並將'MotionEvent'發送到'GestureDetector'。所有這些問題都有點令人困惑。謝謝! – Elad92

+0

@ Elad92像你提到的,你可以幫我改變這個2D滾動代碼嗎? https://gist.github.com/LOG-TAG/0505eedccef9e00821da沒有得到如何發送MotionEvent到一個手勢檢測器_ –

+0

可以任何一個這方面的幫助http://stackoverflow.com/questions/26354263/catch-ontouch- event-by-custom-2d-scrollview-parent-handle-it-and-pass-to-childr –