OnTouchEvent! Interceptando eventos TouchScreen na sua Activity.

Recentemente tive um requisito que implicava em desenhar uma imagem em cada ponto da tela que o usuário tocar. Fiquei assustado com a possibilidade de ter que fazer cálculos mirabolantes para encontrar a coordenada X e Y referente à parte da tela que foi tocada. Porém, após uma breve pesquisa no Google vi que a Activity do Android possui um método que se chama onTouchEvent(MotionEvent event)  que realiza todo esse trabalho.Veja que esse método recebe como parâmetro um objeto do tipo MotionEvent, essa classe possui informações referentes ao toque do usuário, tais como:

 A ação: Se trata de um valor do tipo int que pode ser acessado através do método getAction(). O onTouchEvent é acionado devido a três ações básicas ACTION_DOWN, ACTION_UP e ACTION_MOVE. Como o próprio nome sugere eles significam clicar, soltar e mover o dedo pela tela respectivamente.

Coordenada X e Y: São dois valores do tipo float que indicam o a coordenada do ponto da tela que foi clicado.

Com essas informações em mãos o trabalho ficou muito mais simples. Precisei apenas sobrescrever o método onTouchEvent da minha Activity  e usar algumas funções Canvas para desenhar a minha imagem.

Vejamos um exemplo de uma implementação do método onTouchEvent:

 @Override
 public boolean onTouchEvent(final MotionEvent event) {
   final float x = event.getX();
   final float y = event.getY();

 switch (event.getAction()) {

  case MotionEvent.ACTION_DOWN:
     Log.i("ON TOUCH EVENT", "DOWN + X: " + x + " Y " + y);
  break;

  case MotionEvent.ACTION_MOVE:
    Log.i("ON TOUCH EVENT", "MOVE + X: " + x + " Y " + y);
  break;

  case MotionEvent.ACTION_UP:
     Log.i("ON TOUCH EVENT", "UP + X: " + x + " Y " + y);
  break;

  default:
  break;
}

 return super.onTouchEvent(event);
}

Esse método pode ser muito útil em muitas situações. Como jogos, ou em aplicações de desenho. Os usuários desejam cada vez mais uma maior imersão com aplicativos para dispositivos móveis, esse método é um dos recursos que podem ajudar o desenvolvedor a alcançar esse objetivo.

Anúncios

,

  1. #1 by Wellington on Agosto 29, 2014 - 1:56 pm

    Caramba preciso fazer exatamente isso, tem como passar a parte do canvas também? por exemplo quero desenhar um check em cada ponto de toque.

    • #2 by Leonardo Casasanta on Setembro 4, 2014 - 2:45 am

      Wellington,

      Cria uma classe do tipo View no Android.

      Sobrescreve o método onTouch dela pra tipo esse:

      public boolean onTouch(View view, MotionEvent event) {

      Point point = new Point();
      point.x = event.getX();
      point.y = event.getY();
      points.add(point);
      invalidate();
      return true;
      }

      Sendo que Point é uma classe que tem dois atributos float x e float y. Se trata da posição da tela, que você quer desenhar. E o invalidate é o comando que fala pra View se desenhar.

      Ai você sobrescreve o método onDraw. Desenhando nos points que você coletou no onTouch.

      Tipo isso:

      Point previous = null;
      int i = 0;
      for (Point point : points) {

      if (previous != null && !spaces.contains(i)) {
      canvas.drawLine(previous.x, previous.y, point.x, point.y, paint);
      } else {
      canvas.drawCircle(point.x, point.y, 1, paint);
      }
      previous = point;
      i++;
      }

      Procura na internet Paint para Android que você vai achar uns códigos mais completos.

      Abraço cara.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s

%d bloggers like this: