Gestes


Présentation de cette section :

Je n'ai pas de jour de congé le samedi. Je reviens tout juste d'une coupe de cheveux et je continue d'écrire~

D'accord, ça. section vous apportera quelque chose. C'est la dernière section du chapitre 3 - Gestes, Les amis qui ont utilisé des téléphones mobiles Meizu doivent être familiers avec les gestes Swipe des deux côtés du bouton d'accueil comme sur l'écran. Vous pouvez ouvrir la liste des tâches en arrière-plan, etc. L'utilisation de gestes pour opérer dans l'application améliorera considérablement l'expérience utilisateur. Par exemple, le geste de défilement peut faire défiler l'écran dans le navigateur, Fling peut changer de page dans le navigateur, etc. !

Bien sûr, il y a des avantages et des inconvénients. Par exemple, des opérations gestuelles inappropriées peuvent provoquer APP Carsh, ce qui provoque souvent le mécontentement des utilisateurs ! Alors si vous souhaitez ajouter des gestes à votre application, il faut bien réfléchir ! De plus, les gestes doivent être distingués du toucher à un doigt/multi-doigts appris plus tôt !

Les gestes sont : des comportements tactiles continus, comme faire glisser l'écran vers la gauche et la droite, de haut en bas, ou dessiner des figures géométriques irrégulières ! Android prend en charge les deux comportements gestuels ci-dessus :

  • Android fournit la détection des gestes et fournit les auditeurs correspondants pour la reconnaissance des gestes !
  • Les développeurs Android peuvent ajouter eux-mêmes des gestes et fournir les API correspondantes pour reconnaître les gestes des utilisateurs !

Si votre téléphone est un système Android natif d'Android 4.x, vous pourrez peut-être voir Google sur votre téléphone ou votre tablette. Une application Gesture Builder est fournie, qui permet aux utilisateurs de dessiner un symbole manuscrit d'une manière similaire aux graffitis, ce qui en fait Correspond à un nom de chaîne ! Bien sûr, peu importe si vous n’avez pas un tel téléphone mobile. Essayons d’ouvrir vous-même un système 4.0. Vous le saurez. En plus, on peut aller sur mmtsdcardgestures pour récupérer le fichier qui enregistre les gestes ! Bon, c’est tellement chiant, allons à l’essentiel !

Au fait, publiez d'abord le document officiel de l'API : GestureDetector


1 La séquence d'exécution de l'interaction gestuelle dans Android

  • 1. . Doigt Lorsque l'écran est touché, l'événement MotionEvent est déclenché !
  • 2. Cet événement est surveillé par OnTouchListener, et l'objet MotionEvent peut être obtenu dans sa méthode onTouch() !
  • 3. Transférez l'objet MotionEvent à OnGestureListener via GestureDetector
  • 4. Nous pouvons obtenir l'objet via OnGestureListener, puis obtenir les informations pertinentes et effectuer le traitement associé !

Regardons à quoi servent les trois classes ci-dessus : MotionEvent : Cette classe est utilisée pour encapsuler des gestes, des stylets tactiles, des trackballs, etc. événements. Il encapsule deux attributs importants X et Y en interne, qui sont utilisés pour enregistrer respectivement les coordonnées de l'axe horizontal et de l'axe vertical. GestureDetector : Reconnaître divers gestes. OnGestureListener : Il s'agit d'une interface d'écoute pour l'interaction gestuelle, qui fournit plusieurs méthodes abstraites. Et appelez la méthode correspondante en fonction du résultat de la reconnaissance gestuelle de GestureDetector.

——Les informations ci-dessus sont tirées de : http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1020/448.html

2 Explication détaillée de GestureListener. :

De 1 nous savons que la clé du suivi des gestes est : GestureListener Il nous fournit les méthodes de rappel suivantes :

  • Press (onDown) : Le moment où votre doigt touche l'écran tactile, c'est le toucher.
  • Lancer (onFling) : Action de déplacer rapidement votre doigt sur l'écran tactile et de le relâcher.
  • Appui long (onLongPress) : le doigt est enfoncé pendant un certain temps et n'est pas relâché.
  • Scroll (onScroll) : le doigt glisse sur l'écran tactile.
  • Appuyez et maintenez (onShowPress) : Le doigt est enfoncé sur l'écran tactile, et sa plage de temps prend effet lorsque l'on appuie sur, avant l'appui long.
  • Soulever (onSingleTapUp) : le moment où le doigt quitte l'écran tactile.

Après avoir connu les méthodes associées de GestureListener, il est également très simple de mettre en œuvre la détection des gestes :

  • Étape 1. : Créez un objet GestureDetector et créez Il est nécessaire d'implémenter GestureListener et de passer l'
  • Étape 2 : Gérer l'événement TouchEvent sur l'activité ou un composant spécifique à GestureDetector pour traitement ! Écrivons un code simple pour vérifier ce processus, c'est-à-dire réécrivons la méthode correspondante :

Le code est le suivant :

classe publique MainActivity extends AppCompatActivity {

private MyGestureListener mgListener;
private GestureDetector mDetector;
private final static String TAG = "MyGesture";

@Override
protected void onCreate(Bundle savingInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Instancier les objets GestureListener et GestureDetector
mgListener = new MyGestureListener ();
mDetector = new GestureDetector(this, mgListener);

}

@Override
public boolean onTouchEvent (événement MotionEvent) {
Return mDetector.onTouchEvent ( event);
}

//Personnalisez un GestureListener, c'est sous la classe View, ne vous trompez pas ! ! !
classe privée MyGestureListener implémente GestureDetector.OnGestureListener {

@Override
public boolean onDown(MotionEvent motionEvent) {
Log.d(TAG, "on Down: Press ");
return false;
}

");
}

@Override
public boolean onSingleTapUp(MotionEvent motionEvent) {
Log.d(TAG, "onSingleTapUp : Au moment où le doigt quitte l'écran");
return false;
}

@Override
public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
Log.d(TAG, "onScroll : Slide on the touch screen");
return false se;
}

               @Override
           public void onLongPress(MotionEvent motionEvent)                                                                                  🎜>
@Override
public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
Log.d(TAG, "onFling : glissez rapidement et relâchez");
        return false ;
}
}

}

Captures d'écran de l'opération correspondante :

  • 1. Relâchez immédiatement après avoir appuyé sur :

1.png

  • 2. Appuyez longuement et relâchez :

2.png

  • 3. Glissez doucement et relâchez en même temps :

3.png

  • 4. Appuyez et maintenez enfoncée et continuez à glisser :

4.png

PS : À en juger par les résultats ci-dessus, nous avons trouvé un problème : Lorsque nous implémentons OnGestureListener, nous devons implémenter tous les gestes. Peut-être que je cible uniquement le glissement, mais vous devez quand même le surcharger. Cela semble très drôle, non ? Le fonctionnaire fournira certainement une solution. Le fonctionnaire nous fournit également une classe SimpleOnGestureListener. Remplacez simplement OnGestureListener ci-dessus par SimpleOnGestureListener !


3. Exemple simple : faites glisser vers le bas pour fermer l'activité, faites glisser vers le haut pour démarrer une nouvelle activité

Utilisez SimpleOnGestureListener mentionné ci-dessus pour l'implémenter ici :

Rendu d'opération :

5.gif

Code d'implémentation :

classe publique MainActivity extends AppCompatActivity {

private GestureDetector mDetector;
private final static int MIN_MOVE = 200; //Distance minimale
private MyGestureListener mgListener;
@Override
protected void onCreate(Bundle savingInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Instantiation des objets SimpleOnGestureListener et GestureDetector
mgListener = new MyGestureListener();
mDetector = new GestureDetector(this, mgListener);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
return mDetector . onTouchEvent(event);
}

//Personnalisez un GestureListener, c'est sous la classe View, ne vous trompez pas ! ! !
classe privée MyGestureListener extends GestureDetector.SimpleOnGestureListener {

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float v, float v1) {
If(e1.getY() - e2.getY() > MIN_MOVE){
startActivity(new Intent(MainActivity.this, MainActivity.class));
Toast.makeText(MainActivity.this, "Démarrer l'activité par geste", Toast.LENGTH _SHORT ) .show();
}else if(e1.getY() - e2.getY() < MIN_MOVE){
finish();
Toast.makeText(MainActivity.this ,"Fermer via Activité gestuelle",Toast.LENGTH_SHORT).show();
                >
            return true ;
        }
    }

}

Analyse des résultats : D'après la comparaison ci-dessus, nous pouvons savoir que par rapport à SimpleOnGestureListener, utilisez SimpleOnGestureListener Cela semble plus simple. Vous pouvez réécrire la méthode de votre choix. De plus, l'exemple est relativement simple. Vous pouvez l'essayer vous-même. D'autres façons de jouer, comme zoomer sur des images par des gestes ~


4. Ajout et reconnaissance de gestes :

En plus de la détection de gestes expliquée ci-dessus, Android nous le permet également. pour ajouter des gestes, puis fournit une API d'identification pertinente ; GestureLibrary est utilisé dans Android pour représenter des bibliothèques de gestes, et la classe d'outils GestureLibraries est fournie pour créer des bibliothèques de gestes !

Quatre méthodes statiques pour charger les bibliothèques de gestes :

Après avoir obtenu l'objet GestureLibraries, vous pouvez utiliser les méthodes suivantes fournies par l'objet pour effectuer les opérations correspondantes. :

Méthodes associées :

  • public void addGesture (String EntryName, Gesture Gesture) : Ajouter un geste nommé EntryName
  • public Set<String> getGestureEntries () : récupère les noms de tous les gestes dans la bibliothèque de gestes
  • public ArrayList<Gesture> : Obtenez tous les gestes correspondant au nom de l'entrée public ArrayList<Prediction>
  • recognize
  • (Gesture geste) : Reconnaître tous les gestes correspondant au geste de la bibliothèque de gestes actuelle public void
  • removeEntry
  • (String EntryName) : Supprimez le geste correspondant à l'entryName dans la bibliothèque de gestes public void
  • removeGesture
  • (String EntryName, Gesture Gesture) : Supprimez l'entryName dans la bibliothèque de gestes Gestes qui correspondent au gestepublic abstract boolean
  • save
  • () : Appelez cette méthode après avoir ajouté ou supprimé un geste de la bibliothèque de gestes.
Composant d'édition de gestes GestureOverlayView :

Android fournit trois interfaces d'écoute pour GestureOverlayView, comme suit, les plus couramment utilisées sont :

OnGesturePerformedListener

 ; le geste est terminé, réponse !

5. Exemple d'ajout de gestes :

PS : L'exemple fait référence au code des "Android Crazy Lecture Notes" de Li Gang

Exécution du rendu :

6.gifD'accord, voici le code d'implémentation :

Deux fichiers de mise en page : Activity_main.xml et dialog_save xml<🎜. >

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" < ;TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Veuillez dessiner des gestes sur l'écran ci-dessous~"
android:textSize="20sp" / > ="@+id/geste"
                                                                                                                                                             ,,,, android:layout_width="match_parent" LinearLayout>

dialog_save.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas .android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    < ;LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
       <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="8dp"
            android:text="请填写手势名称:"/>
        <EditText
            android:layout_width= "match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/edit_name"/>
    </LinearLayout>

    <ImageView
android:id="@+id/img_show"
        android:layout_width="128dp"
        android:layout_height="128dp"
        android:layout_marginTop="10dp"/>

</LinearLayout>

MainActivity.java :

public class MainActivity étend AppCompatActivity {

    private EditText editText;
    private GestureOverlayView gesture;

    @Override
    protected void onCreate(Bun dle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取手势编辑组件后,设置相关参数
        gesture = (GestureOverlayView) findViewById(R.id.gesture) ;
        gesture.setGestureColor(Color.GREEN);
        gesture.setGestureStrokeWidth(5);
        gesture.addOnGesturePerformedListener(new GestureOverlayView.OnGesturePerformedListener() {
            @Override
            public void onGesturePerformed(GestureOverlayView gesteOverlayView, final Gesture gesture) {
                View saveDialog = getLayoutInflater().inflate(R.layout.dialog_save,null,false);
                ImageView img_show = (ImageView) saveDialog .findViewById(R.id.img_show);
                final EditText edit_name = (EditText) saveDialog.findViewById(R.id.edit_name);
                Bitmap bitmap = gesture.toBitmap(128,128,10,0xffff0000 );
                img_show.setImageBitmap(bitmap);
                new AlertDialog.Builder(MainActivity.this).setView(saveDialog)
                       .setPositiveButton("保存",new DialogInterface.OnClickListener()
                         {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                //获取文件对对唔的手势库
                                GestureLibrary gestureLib = GestureLibraries.fromFile("/mnt/sdcard/mygestures");
gesteLib.addGesture(edit_name.getText().toString(),gesture);
                               gestureLib.save();
                             }
                         }).setNegativeButton("取消", null).show();
            }
        });
    }
}

Enfin, vous devez ajouter l'autorisation d'écrire sur la carte SD dans AndroidManifest.xml :

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

6 Exemple de reconnaissance gestuelle

Code d'implémentation :

.
classe publique MainActivity extends AppCompatActivity {

geste privé GestureOverlayView;
privé GestureLibrary gesteLibrary;
contexte privé mContext;

@Override
protected void onCreate (Bundle saveInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = MainActivity.this;
gesteLibrary = GestureLibraries.fromFile("mmt/sdcard/ mes gestes");
if (gestureLibrary.load()) {
Toast.makeText(mContext, "Bibliothèque de gestes chargée avec succès", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(mContext, "Echec du chargement de la bibliothèque de gestes", Toast.LENGTH_SHORT).show();
}

}

//Après avoir obtenu le composant d'édition de gestes, définissez le paramètres pertinents
geste = (GestureOverlayView ) findViewById(R.id.gesture);
geste.setGestureColor(Color.GREEN);
geste.setGestureStrokeWidth(5);
geste.addOnGesturePerformedListener(new GestureOverlayView .OnGesturePerformedList ener() {
              @ Override
public void onGesturePerformed(GestureOverlayView GestureOverlayView, final Gesture Gesture) {
//Reconnaître le geste que l'utilisateur vient de dessiner
ArrayList<Prediction> reconnaître(geste);
                       ArrayList<String> result = new ArrayList<String>();<🎜> //Parcourir tous les objets de prédiction trouvés<🎜>pour (Prédiction pred : prédictions) {
                                                                                                                                                                                                                                                               ​pred.score);
}
}
if (result.size() > 0) {
                <Object> ArrayAdapter<Object>(mContext,
                                      android.R.layout.simple_dropdown_item_1line , Result.Toarray ());
Nouveau Alertdialog.Builder (mcontext) .setadapter (adapter, null) .setpositiveBut tonne ("OK", NULL ) .show ();
} else {
Toast. makeText(mContext,"Impossible de trouver le geste correspondant!",Toast.LENGTH_SHORT).show();
                                                                                                                                                                                                                     N'oubliez pas d'ajouter l'autorisation pour lire la carte SD dans le fichier AndroidManifest.xml :


<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

Résumé de cette section :

D'accord, cette section présente les gestes gestuels dans Android et explique trois contenus : le jugement gestuel, l'ajout de gestes et la reconnaissance gestuelle. , la plupart des exemples proviennent des notes de cours Android Crazy du professeur Li Gang. Si vous êtes intéressé, vous pouvez lire le livre ~ Merci
.