Como obter a visão subjacente de um MotionEvent?

10

Minha classe GestureListener recebe um MotionEvent em métodos como onSingleTap () ou onFling (). Existe uma maneira de determinar a visão subjacente deste evento?

Histórico: eu tenho um LinearLayout que contém muitas exibições de filhos. Este LinearLayout tem um ouvinte de toque, que chama um detector de gestos. Assim, quando o usuário faz um gesto em qualquer visão infantil, o detector de gestos do LinearLayout recebe um MotionEvent. Mas o problema é que, como há muitos filhos, preciso saber exatamente em qual criança o usuário tocou. Mas não consigo encontrar um método que converta uma coordenada para uma exibição. Existe uma maneira de fazer isso?

Uma solução feia: as crianças são adicionadas dinamicamente. Então eu posso manter todas as crianças em uma lista, então quando um MotionEvent vem, eu posso percorrer a lista e ver se o ponto está dentro de uma criança. Mas eu não gosto dessa ideia. Existe uma maneira melhor?

    
por wwyt 23.05.2011 в 05:28
fonte

4 respostas

3

Tem certeza de que deseja o ouvinte de toque no layout? Por que cada exibição não tem um ouvinte de toque?

Vamos supor que você tenha um monte de opções que exigem flings para alternar. Os comutadores controlam um monstro. Você pode fazer com que cada switch (sua Visualização) tenha um ouvinte de toque que transmita o switch para o monstro. Agora o monstro pode lidar com cada visão de maneira diferente.

Algo parecido com isto:

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

Você pode até passar o MotionEvent para o monstro. (Ou, se você quiser um único tipo de TouchListeners, pode passar a visualização e o evento para o monstro, mas perde a informação sobre qual switch é qual).

    
por idbrii 12.08.2011 / 00:45
fonte
1

Como você usa um ontouchlistener em seu grupo de visualização superior, o LinearLayout, para manipular eventos, se o valor de retorno de ontouch listener for true, o mesmo não será despachado para nenhum outro destino. Então, provavelmente você precisa usar o método feio. Estou envolvido neste assunto e acho isso muito chato.

Caso contrário, defina ontouchlistener para cada childview conforme necessário.

    
por Neo 23.05.2011 / 06:19
fonte
1

Se puder, use um ListView ou GridView sobre o layout base (Linear ou não) e sob suas exibições filhas.

Então ...

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

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

Você também pode ouvir as crianças gerenciando cuidadosamente o booleano que você retorna ao manusear.

    
por kandinski 25.08.2015 / 22:11
fonte
0

Dê aos filhos um id e, a partir da visualização pai, use parentView.findViewById (R.id.childviewid);

    
por sat 23.05.2011 / 05:40
fonte