Recentemente precisei implementar a detecção do gesto de swipe em uma aplicação iOS que estava desenvolvendo. Achei super fácil e resolvi pesquisar como fazer o mesmo no Android. Eis que achei a solução abaixo. (Não me lembro o post original, quem souber, posta um comentário pls).
public class MainActivity extends Activity
implements OnClickListener, OnTouchListener {
private GestureDetector gestureDetector;
private TextView txtResultado;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtResultado =
(TextView)findViewById(R.id.txtResultado);
gestureDetector =
new GestureDetector(this, new DetectorDeGesto());
// Apesar da linha abaixo não fazer nada,
// não funcionou sem...
findViewById(R.id.raizLayout).
setOnClickListener(this);
findViewById(R.id.raizLayout).
setOnTouchListener(this);
}
@Override
public void onClick(View v) {
Log.d("NGVL", "onclick");
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
class DetectorDeGesto
extends SimpleOnGestureListener {
private static final int DISTANCIA_MINIMA = 120;
private static final int DISTANCIA_MAXIMA = 250;
private static final int VELOCIDADE_MINIMA = 200;
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
try {
boolean excedeuDistanciaEmY =
Math.abs(e1.getY() - e2.getY())
> DISTANCIA_MAXIMA;
if (excedeuDistanciaEmY) return false;
boolean velocidadeValida =
Math.abs(velocityX) > VELOCIDADE_MINIMA;
boolean swipeLeft =
e1.getX() - e2.getX() > DISTANCIA_MINIMA;
boolean swipeRight =
e2.getX() - e1.getX() > DISTANCIA_MINIMA;
// right to left swipe
if(swipeLeft && velocidadeValida) {
txtResultado.setText("Left Swipe");
// left to right swipe
} else if (swipeRight && velocidadeValida) {
txtResultado.setText("Right Swipe");
}
} catch (Exception e) {
}
return false;
}
}
}
A classe SimpleOnGestureListener é uma classe básica do Android que consegue detectar diversos gestos simples como scroll, double tap, entre outros. Nossa classe DetectorDeGesto, herda dessa classe e sobrescreve o método onFling, que é chamado quando o usuário está deslizando o dedo sobre a tela (esse evento é armazenado em e2) e guarda a referência de quando o usuário pressionou o dedo sobre a tela inicialmente (armazenado em e1). Nesse método verificamos a direção que foi feito o swipe, bem como a velocidade que o movimento foi feito. As distâncias mínima e máxima para considerarmos o gesto válido, assim como a velocidade mínima estão definidas nas constantes da classe.Nossa Activity implementa as interfaces View.OnClickListener e OnTouchListener. No método onTouch, delegamos o tratamento do evento de touch para o nosso detector de Gesto. Para que isso aconteça, no onCreate, criamos um GestureDetector (que é outra classe do próprio Android) passando o nosso detector de gestos. Em seguida, pegamos a referência da view que queremos tratar o evento de touch e setamos o onTouchListener e o onClickListener.
O arquivo de layout usado no projeto é mostrado abaixo:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/raizLayout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/txtResultado"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:textSize="40dp"
tools:context=".MainActivity" />
</RelativeLayout>
Pronto! É só rodar a aplicação e testar SWIPE pra esquerda e direita.
Qualquer dúvida, é só deixar seus comentários.
4br4ç05,
nglauber



