web-dev-qa-db-fra.com

Comment augmenter la taille d'un élément actuellement ciblé sur un RecyclerView?

J'essaie de faire une liste horizontale avec une RecyclerView, que lorsque je mets l'accent sur un élément, en augmente la taille. Je veux faire cet effet:

 Increased item effect

Avez-vous des idées pour accomplir cela?

20
Skycorsarius

Grâce à dextor answer, j'ai pu comprendre cette réponse.

J'ai utilisé la variable FocusChangeListener et ajouté des états d'animation pour modifier la taille de la vue:

static class ViewHolder extends RecyclerView.ViewHolder {

public ViewHolder(final View root) {
    // bind views
    // ...

    // bind focus listener
    root.setOnFocusChangeListener(new View.OnFocusChangeListener() {
         @Override
         public void onFocusChange(View v, boolean hasFocus) {
             if (hasFocus) {
                 // run scale animation and make it bigger
                 Animation anim = AnimationUtils.loadAnimation(context, R.anim.scale_in_tv);
                 root.startAnimation(anim);
                 anim.setFillAfter(true);
             } else {
                 // run scale animation and make it smaller
                 Animation anim = AnimationUtils.loadAnimation(context, R.anim.scale_out_tv);
                 root.startAnimation(anim);
                 anim.setFillAfter(true);
             }
         }
    });
}

Et le code pour les anims:

scale_in_tv:

<scale xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="300"
    Android:fromXScale="100%"
    Android:fromYScale="100%"
    Android:toXScale="110%"
    Android:toYScale="110%"
    Android:pivotX="50%"
    Android:pivotY="50%">
</scale>

scale_out_tv:

<scale xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:duration="100"
    Android:fromXScale="110%"
    Android:fromYScale="110%"
    Android:toXScale="100%"
    Android:toYScale="100%"
    Android:pivotX="50%"
    Android:pivotY="50%">
</scale>
1
Skycorsarius

J'imagine quelque chose comme ça:

  1. Créer le RV horizontal
  2. Lors de la liaison du ViewHolder, attachez une FocusChangeListener à la vue racine de l'élément
  3. Lorsque l'élément gagne le focus, redimensionnez-le pour le rendre légèrement plus grand; lorsque le focus est perdu, retournez l'animation.

static class ViewHolder extends RecyclerView.ViewHolder {

  public ViewHolder(View root) {
    // bind views
    // ...

    // bind focus listener
    root.setOnFocusChangeListener(new View.OnFocusChangeListener() {
      @Override
        public void onFocusChange(View v, boolean hasFocus) {
          if (hasFocus) {
            // run scale animation and make it bigger
          } else {
            // run scale animation and make it smaller
          }
        }
     });
  }
}
15
Sebastiano