Android - Gestes

Android fournit des types spéciaux d'événements d'écran tactile tels que pincement, double pression, défilement, appui long et tressaillement. Ce sont tous connus sous le nom de gestes.

Android fournit la classe GestureDetector pour recevoir des événements de mouvement et nous dire que ces événements correspondent ou non à des gestes. Pour l'utiliser, vous devez créer un objet de GestureDetector puis étendre une autre classe avecGestureDetector.SimpleOnGestureListenerpour agir en tant qu'auditeur et remplacer certaines méthodes. Sa syntaxe est donnée ci-dessous -

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) {
   }
}

Gérer le geste de pincement

Android fournit ScaleGestureDetectorclass pour gérer les gestes comme le pincement, etc. Pour l'utiliser, vous devez instancier un objet de cette classe. Sa syntaxe est la suivante -

ScaleGestureDetector SGD;
SGD = new ScaleGestureDetector(this,new ScaleListener());

Le premier paramètre est le contexte et le deuxième paramètre est l'écouteur d'événements. Nous devons définir l'écouteur d'événements et remplacer une fonctionOnTouchEventpour le faire fonctionner. Sa syntaxe est donnée ci-dessous -

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;
   }
}

Outre les gestes de pincement, il existe d'autres méthodes disponibles qui notifient davantage les événements tactiles. Ils sont listés ci-dessous -

Sr. Non Méthode et description
1

getEventTime()

Cette méthode obtient l'heure de l'événement en cours de traitement.

2

getFocusX()

Cette méthode obtient la coordonnée X du point focal du geste actuel.

3

getFocusY()

Cette méthode obtient la coordonnée Y du point focal du geste actuel.

4

getTimeDelta()

Cette méthode renvoie la différence de temps en millisecondes entre l'événement de mise à l'échelle accepté précédent et l'événement de mise à l'échelle actuel.

5

isInProgress()

Cette méthode renvoie true si un geste de mise à l'échelle est en cours

6

onTouchEvent(MotionEvent event)

Cette méthode accepte MotionEvents et distribue les événements le cas échéant.

Exemple

Voici un exemple illustrant l'utilisation de la classe ScaleGestureDetector. Il crée une application de base qui vous permet de zoomer et dézoomer par pincement.

Pour expérimenter cet exemple, vous pouvez l'exécuter sur un appareil réel ou dans un émulateur avec écran tactile activé.

Pas La description
1 Vous utiliserez Android Studio pour créer une application Android sous un package com.example.sairamkrishna.myapplication.
2 Modifiez le fichier src / MainActivity.java pour ajouter le code nécessaire.
3 Modifiez le res / layout / activity_main pour ajouter les composants XML respectifs
4 Exécutez l'application et choisissez un appareil Android en cours d'exécution, installez l'application dessus et vérifiez les résultats

Voici le contenu du fichier d'activité principal modifié 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;
      }
   }
}

Voici le contenu modifié du xml res/layout/activity_main.xml.

Ici abc indique le 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>

Voici le contenu de la res/values/string.xml.

<resources>
   <string name="app_name>My Application</string>
</resources>

Voici le contenu de AndroidManifest.xml fichier.

<?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>

Essayons d'exécuter votre application. Je suppose que vous avez connecté votre appareil mobile Android à votre ordinateur. Pour exécuter l'application à partir du studio Android, ouvrez l'un des fichiers d'activité de votre projet et cliquez sur l' icône Exécuter dans la barre d'outils. L'exemple de sortie devrait ressembler à ceci:

Maintenant, placez simplement deux doigts sur l'écran Android et séparez-les en une partie et vous verrez que l'image Android est en train de zoomer. Il est montré dans l'image ci-dessous -

Maintenant, placez à nouveau deux doigts sur l'écran Android et essayez de les fermer et vous verrez que l'image Android est maintenant en train de rétrécir. Il est montré dans l'image ci-dessous -