Android: gestos
Android proporciona tipos especiales de eventos de pantalla táctil como pellizcar, tocar dos veces, desplazarse, presionar prolongadamente y retroceder. Todos estos se conocen como gestos.
Android proporciona la clase GestureDetector para recibir eventos de movimiento y decirnos que estos eventos corresponden a gestos o no. Para usarlo, debe crear un objeto de GestureDetector y luego extender otra clase conGestureDetector.SimpleOnGestureListenerpara actuar como oyente y anular algunos métodos. Su sintaxis se da a continuación:
GestureDetector myG;
myG = new GestureDetector(this,new Gesture());
class Gesture extends GestureDetector.SimpleOnGestureListener{
public boolean onSingleTapUp(MotionEvent ev) {
}
public void onLongPress(MotionEvent ev) {
}
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
}
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
}
}
Manejo del gesto de pellizco
Android proporciona ScaleGestureDetectorclass para manejar gestos como pellizcar, etc. Para poder usarlo, necesita crear una instancia de un objeto de esta clase. Su sintaxis es la siguiente:
ScaleGestureDetector SGD;
SGD = new ScaleGestureDetector(this,new ScaleListener());
El primer parámetro es el contexto y el segundo parámetro es el detector de eventos. Tenemos que definir el detector de eventos y anular una función.OnTouchEventpara que funcione. Su sintaxis se da a continuación:
public boolean onTouchEvent(MotionEvent ev) {
SGD.onTouchEvent(ev);
return true;
}
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
float scale = detector.getScaleFactor();
return true;
}
}
Además de los gestos de pellizco, hay otros métodos disponibles que notifican más sobre eventos táctiles. Se enumeran a continuación:
No Señor | Método y descripción |
---|---|
1 | getEventTime() Este método obtiene la hora del evento actual que se está procesando. |
2 | getFocusX() Este método obtiene la coordenada X del punto focal del gesto actual. |
3 | getFocusY() Este método obtiene la coordenada Y del punto focal del gesto actual. |
4 | getTimeDelta() Este método devuelve la diferencia de tiempo en milisegundos entre el evento de escalado aceptado anterior y el evento de escalado actual. |
5 | isInProgress() Este método devuelve verdadero si hay un gesto de escala en curso. |
6 | onTouchEvent(MotionEvent event) Este método acepta MotionEvents y distribuye eventos cuando es apropiado. |
Ejemplo
Aquí hay un ejemplo que demuestra el uso de la clase ScaleGestureDetector. Crea una aplicación básica que le permite acercar y alejar con pellizco.
Para experimentar con este ejemplo, puede ejecutarlo en un dispositivo real o en un emulador con pantalla táctil habilitada.
Pasos | Descripción |
---|---|
1 | Utilizará Android Studio para crear una aplicación de Android en un paquete com.example.sairamkrishna.myapplication. |
2 | Modifique el archivo src / MainActivity.java para agregar el código necesario. |
3 | Modifique res / layout / activity_main para agregar los componentes XML respectivos |
4 | Ejecute la aplicación y elija un dispositivo Android en ejecución e instale la aplicación en él y verifique los resultados |
A continuación se muestra el contenido del archivo de actividad principal modificado src/MainActivity.java.
package com.example.sairamkrishna.myapplication;
import android.app.Activity;
import android.graphics.Matrix;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ImageView iv;
private Matrix matrix = new Matrix();
private float scale = 1f;
private ScaleGestureDetector SGD;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv=(ImageView)findViewById(R.id.imageView);
SGD = new ScaleGestureDetector(this,new ScaleListener());
}
public boolean onTouchEvent(MotionEvent ev) {
SGD.onTouchEvent(ev);
return true;
}
private class ScaleListener extends ScaleGestureDetector.
SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
scale *= detector.getScaleFactor();
scale = Math.max(0.1f, Math.min(scale, 5.0f));
matrix.setScale(scale, scale);
iv.setImageMatrix(matrix);
return true;
}
}
}
A continuación se muestra el contenido modificado del xml res/layout/activity_main.xml.
Aquí abc indica el logo de tutorialspoint
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView android:text="Gestures
Example" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textview"
android:textSize="35dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point"
android:id="@+id/textView"
android:layout_below="@+id/textview"
android:layout_centerHorizontal="true"
android:textColor="#ff7aff24"
android:textSize="35dp" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:src="@drawable/abc"
android:scaleType="matrix"
android:layout_below="@+id/textView"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
A continuación se muestra el contenido de la res/values/string.xml.
<resources>
<string name="app_name>My Application</string>
</resources>
A continuación se muestra el contenido de AndroidManifest.xml archivo.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sairamkrishna.myapplication" >
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.sairamkrishna.myapplicationMainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Intentemos ejecutar su aplicación. Supongo que ha conectado su dispositivo móvil Android real con su computadora. Para ejecutar la aplicación desde Android Studio, abra uno de los archivos de actividad de su proyecto y haga clic en el icono Ejecutar en la barra de herramientas. La salida de muestra debería ser así:
Ahora simplemente coloque dos dedos sobre la pantalla de Android, sepárelos en una parte y verá que la imagen de Android se está ampliando. Se muestra en la imagen a continuación:
Ahora vuelva a colocar dos dedos sobre la pantalla de Android e intente cerrarlos y verá que la imagen de Android ahora se está reduciendo. Se muestra en la imagen a continuación: