2011-05-23 116 views
9

My GestureListener類在onSingleTap()或onFling()方法中接收MotionEvent。有沒有辦法確定此事件的基本視圖?如何從MotionEvent獲取底層視圖?

背景:我有一個包含許多子視圖的LinearLayout。這個LinearLayout上有一個觸摸監聽器,它調用一個手勢檢測器。所以當用戶在任何子視圖上做手勢時,LinearLayout的手勢檢測器會接收一個MotionEvent。但問題是,因爲有很多孩子,我需要確切地知道用戶點擊了哪個孩子。但我找不到將座標轉換爲視圖的方法。有沒有辦法做到這一點?

醜陋的解決方案:孩子們是動態添加的。所以我可以將所有的孩子都放在一個列表中,然後當一個MotionEvent出現時,我可以遍歷列表並查看點是否在孩子的內部。但我不喜歡這個想法。有沒有更好的辦法?

回答

0

給孩子的ID和從父視圖中,使用parentView.findViewById(R.id.childviewid);

+0

感謝您的回覆。但是我正在尋找一種方式來獲得從coordiante視圖。實際上,你提到的方式,對於我提到的「醜陋解決方案」 - 我在其中保存了所有孩子ID的列表,然後查詢其中的所有孩子ID,看看是否有座標落在其中。 – wwyt 2011-05-23 03:57:28

1

由於您使用的ontouchlistener您的俯視圖集團的LinearLayout,處理motionevents,如果ontouchlistener的返回值是真,甚至不會被分派到任何其他目標。所以可能你需要使用醜陋的方法。我目前從事這個問題,並發現它真的很煩人。

否則,根據需要爲每個子視圖設置ontouchlistener。

+0

是的,我想除了醜陋的方式以外沒有別的辦法。那麼,只要它有效。謝謝! – wwyt 2011-05-23 06:29:12

3

您確定要在佈局上使用觸摸偵聽器嗎?爲什麼不讓每個視圖都有觸摸監聽器?

讓我們假設你有一堆交換機需要掠過切換。開關控制怪物。您可以讓每個開關(您的視圖)都有一個觸摸偵聽器,將開關傳遞給怪物。現在怪物可以以不同的方式處理每個視圖。

事情是這樣的:

brightnessSwitch.setOnTouchListener(new View.OnTouchListener() { 
    boolean onTouch(View v, MotionEvent event) { 
    monster.toggleBrightness(); 
    return true; 
    }); 

你甚至可以傳遞給怪物MotionEvent。 (或者如果你想要一種類型的TouchListeners,你可以將視圖和事件都傳遞給怪物,但是你失去了關於哪個開關是哪個的信息。)

1

如果可以,請使用ListView或GridView基本佈局(線性或其他)和您的子視圖下。

則...

INT POS = getGridView()pointToPosition((int)的me.getX(),(INT)me.getY())。

查看v = getGridView()。getChildAt(pos);

您還可以仔細聽孩子們小心地管理處理時返回的布爾值。

+0

這在使用ListView時給了我無意義的結果。這裏的答案可靠地爲我工作:http://stackoverflow.com/questions/4165765/how-to-get-a-view-from-an-event-coordinates-in-android – aroth 2017-03-23 06:38:00