2011-05-23 25 views
9

Mi clase GestureListener recibe un MotionEvent en métodos como onSingleTap() o onFling(). ¿Hay alguna forma de determinar la vista subyacente de este evento?¿Cómo obtener la vista subyacente desde MotionEvent?

Fondo: Tengo un LinearLayout que contiene muchas vistas secundarias. Este LinearLayout tiene un oyente táctil en él, que llama a un detector de gestos. Entonces, cuando el usuario hace un gesto en cualquier vista secundaria, el detector de gestos de LinearLayout recibe un evento MotionEvent. Pero el problema es que debido a que hay muchos niños, necesito saber exactamente a qué niño recurrió el usuario. Pero no puedo encontrar un método que convierta una coordenada en una vista. ¿Hay alguna forma de hacer esto?

Una solución fea: los elementos secundarios se agregan dinámicamente. De modo que puedo mantener a todos los niños en una lista, y cuando llega un MotionEvent, puedo recorrer la lista y ver si el punto está dentro de un niño. Pero no me gusta esta idea. ¿Hay una mejor manera?

Respuesta

0

Proporcione a los niños una identificación y, desde la vista principal, use parentView.findViewById (R.id.childviewid);

+0

gracias por la respuesta. Pero estoy buscando una forma de obtener una vista de coordiante. La forma en que sugirió es, en realidad, para la "solución fea" que mencioné, donde guardo una lista de todos los ID de los niños, luego consulto a través de todos ellos para ver si una coordenada cae en uno de ellos. – wwyt

1

Dado que utiliza un ontouchlistener en su grupo de vista superior, LinearLayout, para manejar motionevents, si el valor de retorno de ontouchlistener es verdadero, el par no se enviará a ningún otro objetivo. Entonces probablemente necesites usar el método feo. Actualmente estoy involucrado en este tema y lo encuentro realmente molesto.

De lo contrario, configure ontouchlistener para cada vista secundaria según sea necesario.

+0

Sí, creo que realmente no hay otro camino más que el camino feo. Bueno, mientras funcione. ¡Gracias! – wwyt

3

¿Está seguro de que quiere el oyente táctil en el diseño? ¿Por qué no hacer que cada vista tenga un oyente táctil?

Supongamos que tiene un grupo de interruptores que requieren aventuras para alternar. Los interruptores controlan un monstruo. Podrías hacer que cada interruptor (tu Vista) tuviese un oyente táctil que pasa el interruptor al monstruo. Ahora el monstruo puede manejar cada vista de manera diferente.

Algo como esto:

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

Incluso se puede pasar el MotionEvent en el monstruo. (O si desea un tipo único de TouchListeners, puede pasar tanto la vista como el evento al monstruo, pero pierde información sobre qué interruptor es cuál).

1

Si puede, use un ListView o GridView sobre su diseño base (lineal o de otro tipo) y bajo las vistas de su hijo.

Entonces ...

int pos = getGridView() pointToPosition ((int) me.getX(), (int) me.getY()).;

Ver v = getGridView(). GetChildAt (pos);

También puede escuchar a los niños manejando cuidadosamente el booleano que devuelve al manipularlo.

+0

Esto me dio resultados sin sentido al usar un 'ListView'. La respuesta aquí funciona de manera confiable para mí: http://stackoverflow.com/questions/4165765/how-to-get-a-view-from-an-event-coordinates-in-android – aroth

Cuestiones relacionadas