Detectando Gestos
Pessoal, hoje vamos falar sobre um ítem interessante que vários dispositivos tem explorado, a interface por gestos. Hoje iniciaremos falando sobre a interface mais comum delas, ou seja como detectar os gestos básicos.
Vamos começar por definir do que estamos falando.Um “gesto de toque“ ocorre quando um usuário coloca um ou mais dedos na tela sensível ao toque, e sua aplicação interpreta que o padrão de toques como um gesto particular. Há correspondentemente duas fases para a detecção de gesto:
- Coleta de dados sobre eventos de toque;
- Interpretando os dados para ver se ele atende aos critérios para qualquer um dos gestos de seu aplicativo suporta.
Coletando os Dados
Vamos ver como coletar estes dados.
Primeiramente vamos conhecer as Classes da Biblioteca que fornecem suporte. Vamos usar primeiramente as classes GestureDetectorCompat e MotionEventCompat.Você deve usar as classes biblioteca de suporte sempre que possível para fornecer compatibilidade com dispositivos que executam o Android 1.6 e superior. Note-se que MotionEventCompat não é um substituto para a classe MotionEvent. Em vez disso, ele fornece métodos utilitários estáticos para que você passar o seu objeto MotionEvent a fim de receber a ação desejada associado a esse evento.
Quando um usuário toca com um ou mais dedos na tela, este aciona o onTouchEvent callback() na visão de que recebeu os eventos de toque. Para cada seqüência de eventos de toque (posição, pressão, tamanho, a adição de outro dedo, etc) que é em última análise, identificados como um gesto, onTouchEvent () é disparado várias vezes.
O gesto é iniciado quando o usuário toca a tela primeiro, continua como o sistema rastreia a posição do dedo (s) do usuário, e termina por capturar o evento final dos dedos do usuário sair da tela. Ao longo desta interação, o MotionEvent entregue a onTouchEvent() fornece os detalhes de cada interação. Seu aplicativo pode usar os dados fornecidos pelo MotionEvent para determinar se um gesto que se preocupa com acontecido.
Para interceptar eventos de toque em uma atividade ou View, substituir o callback onTouchEvent().
No exemplo abaixo usa getActionMasked() para extrair a ação do usuário executada a partir do parâmetro de evento. Isto dá-lhe os dados brutos que você precisa para determinar se um gesto de quem gosta ocorreu:
public class MainActivity extends Activity { @Override public boolean onTouchEvent(MotionEvent event){ int action = MotionEventCompat.getActionMasked(event); switch(action) { case (MotionEvent.ACTION_DOWN) : Log.d(DEBUG_TAG,"Ação: para Cima"); return true; case (MotionEvent.ACTION_MOVE) : Log.d(DEBUG_TAG,"Ação: Movimento"); return true; case (MotionEvent.ACTION_UP) : Log.d(DEBUG_TAG,"Ação: para Baixo"); return true; case (MotionEvent.ACTION_CANCEL) : Log.d(DEBUG_TAG,"Ação: Cancelou"); return true; case (MotionEvent.ACTION_OUTSIDE) : Log.d(DEBUG_TAG,"Movimento ocorreu fora do elemento"); return true; default : return super.onTouchEvent(event); } }
Detectando Diversos Gestos
Quando você instanciar um objeto GestureDetectorCompat, um dos parâmetros que é necessário é uma classe que implementa a interface GestureDetector.OnGestureListener. Esta interface notifica os usuários quando um evento de toque especial ocorreu. Para torná-lo possível para o seu objeto GestureDetector para receber eventos, você substituir o Vista ou o método de Atividade onTouchEvent(), e passar adiante todos os eventos observados para a instância do detector.
No trecho a seguir, um valor de retorno da verdadeira do indivíduo em <> TouchEvent métodos indica que você tem tratado o evento de toque. Um valor de retorno falso passa eventos ao longo da pilha de vista até que o toque foi tratado com sucesso.
Execute o seguinte trecho para ter uma idéia de como as ações são desencadeadas quando você interage com a tela sensível ao toque, e que o conteúdo do MotionEvent são para cada evento de toque. Você vai perceber o quanto os dados estão sendo gerados, mesmo para interações simples.
public class MainActivity extends Activity implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener{ private static final String DEBUG_TAG = "Gestos"; private GestureDetectorCompat mDetector; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mDetector = new GestureDetectorCompat(this,this); mDetector.setOnDoubleTapListener(this); } @Override public boolean onTouchEvent(MotionEvent event){ this.mDetector.onTouchEvent(event); return super.onTouchEvent(event); } @Override public boolean onDown(MotionEvent event) { Log.d(DEBUG_TAG,"onDown: " + event.toString()); return true; } @Override public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { Log.d(DEBUG_TAG, "onFling: " + event1.toString()+event2.toString()); return true; } @Override public void onLongPress(MotionEvent event) { Log.d(DEBUG_TAG, "onLongPress: " + event.toString()); } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Log.d(DEBUG_TAG, "onScroll: " + e1.toString()+e2.toString()); return true; } @Override public void onShowPress(MotionEvent event) { Log.d(DEBUG_TAG, "onShowPress: " + event.toString()); } @Override public boolean onSingleTapUp(MotionEvent event) { Log.d(DEBUG_TAG, "onSingleTapUp: " + event.toString()); return true; } @Override public boolean onDoubleTap(MotionEvent event) { Log.d(DEBUG_TAG, "onDoubleTap: " + event.toString()); return true; } @Override public boolean onDoubleTapEvent(MotionEvent event) { Log.d(DEBUG_TAG, "onDoubleTapEvent: " + event.toString()); return true; } @Override public boolean onSingleTapConfirmed(MotionEvent event) { Log.d(DEBUG_TAG, "onSingleTapConfirmed: " + event.toString()); return true; } }
Detectando um subconjunto de gestos suportados
Se você só quer processar alguns gestos, você pode estender GestureDetector.SimpleOnGestureListener em vez de implementar a interface GestureDetector.OnGestureListener.
GestureDetector.SimpleOnGestureListener fornece uma implementação para todos os em <> TouchEvent métodos retornando falso para todos eles. Assim, você pode substituir apenas os métodos que você gosta. Por exemplo, o trecho abaixo cria uma classe que estende GestureDetector.SimpleOnGestureListener e substitui onFling () e onDown ().
Se vai ou não usar GestureDetector.OnGestureListener, é melhor prática para implementar um método onDown() que retorna true. Isto porque todos os gestos começar com uma mensagem onDown(). Se retornar falso de onDown (), como GestureDetector.SimpleOnGestureListener faz por padrão, o sistema assume que você deseja ignorar o resto do gesto, e os outros métodos de GestureDetector.OnGestureListener nunca são chamados. Este tem o potencial de causar problemas inesperados em seu aplicativo. A única vez que você deve retornar false de onDown () é que se você realmente quiser ignorar um gesto inteiro.
public class MainActivity extends Activity { private GestureDetectorCompat mDetector; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mDetector = new GestureDetectorCompat(this, new MyGestureListener()); } @Override public boolean onTouchEvent(MotionEvent event){ this.mDetector.onTouchEvent(event); return super.onTouchEvent(event); } class MyGestureListener extends GestureDetector.SimpleOnGestureListener { private static final String DEBUG_TAG = "Gestures"; @Override public boolean onDown(MotionEvent event) { Log.d(DEBUG_TAG,"onDown: " + event.toString()); return true; } @Override public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { Log.d(DEBUG_TAG, "onFling: " + event1.toString()+event2.toString()); return true; } } }
Bom pessoal este é um primeira instrução para que vocês possam ter contato como são realizadas as capturas dos toques ou gestos na tela no dispositivo. Mais adiante vamos ver outras formas, um pouco mais avançadas de manipular os gestos.
The post Android, Detectando Gestos appeared first on NumeroReal.