2013-07-24 64 views
4

我在我的Activity中實施了GestureDetector。現在,我可以抓住從整屏的全部活動,如onSingleTapConfirmedonDoubleTaponLongPress ...獲取觸摸手勢檢測器的視圖

是否有可能發現,這View從我的自定義佈局被壓?

回答

1

在Android中你有平臺的源代碼,所以我會推薦看看核心ViewGroups是如何實現的,並從中學習。

讓我們來看ViewGroup的來源here。尋找功能dispatchTouchEvent()。它幾乎做你想要做的。

要確定哪個視圖是實際點擊的,它遍歷所有子視圖,要求每個視圖的hitrect並檢查它是否相關。代碼:

for (int i = count - 1; i >= 0; i--) { 
    final View child = children[i]; 
    if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE 
     || child.getAnimation() != null) { 
     child.getHitRect(frame); 
     if (frame.contains(scrolledXInt, scrolledYInt)) { 

我只能建議你做類似的事情。

我想你不會想這樣做手動迭代(或遞歸,因爲你可能想進入視圖內的視圖),因爲,讓我們面對它,這是非常噁心。在這種情況下,也許你可以讓常規機制發揮它的魅力(讓事件像通常那樣流入子視圖)。然後在你想要處理的特定視圖上設置事件處理程序,並讓你的處理程序被調用,並以某種方式通知你點擊了哪個視圖。

要記住的另一個有趣的事情是自定義佈局可能會爲其子視圖實現靜態轉換ViewGroup.setStaticTransformationsEnabled()。當我實現3D視圖輪播時,我使用了這些轉換。在這種情況下,我很確定你想做什麼是不可能的。子視圖並不知道它們在哪裏,因爲靜態轉換將它們繪製在屏幕上的其他位置。在這種情況下,您處於自定義佈局的寬限期以正確地爲您分派事件到其子視圖。

+0

第二種解決方案似乎更好。我會盡力走這條路。 – hsz