web-dev-qa-db-fra.com

Android animation à l'échelle affichée

Je souhaite utiliser ScaleAnimation (pas par programmation en xml) pour modifier la hauteur et afficher de 0 à 60% de la hauteur du parent. La largeur de vue est constante et est 50px. La vue est vide, seule la couleur d'arrière-plan est définie.

Quelqu'un peut-il me donner du code pour scaleAnim en utilisant ScaleAnimation à partir du code.

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:id="@+id/layContainer
    >
<View  
    Android:layout_width="50px" 
    Android:layout_height="fill_parent" 
    Android:id="@+id/viewContainer" 
    Android:background:"#00f00"
    />

</LinearLayout>


ScaleAnimation scaleAnim = new ScaleAnimation(...);

view before and after animation

voir avant et après l'animation .Merci

53
Jovan

Voici un code pour faire exactement cela.

public void scaleView(View v, float startScale, float endScale) {
    Animation anim = new ScaleAnimation(
            1f, 1f, // Start and end values for the X axis scaling
            startScale, endScale, // Start and end values for the Y axis scaling
            Animation.RELATIVE_TO_SELF, 0f, // Pivot point of X scaling
            Animation.RELATIVE_TO_SELF, 1f); // Pivot point of Y scaling
    anim.setFillAfter(true); // Needed to keep the result of the animation
    anim.setDuration(1000);
    v.startAnimation(anim);
}

Le constructeur ScaleAnimation utilisé ici prend 8 arguments, 4 relatifs à la gestion de l'échelle X dont nous ne nous soucions pas de (1f, 1f, ... Animation.RELATIVE_TO_SELF, 0f, ...).

Les 4 autres arguments concernent la mise à l'échelle Y dont nous nous soucions.

startScale, endScale - Dans votre cas, vous utiliseriez 0f, 0.6f.

Animation.RELATIVE_TO_SELF, 1f - Ceci spécifie où la réduction de la vue se réduit (appelée pivot dans la documentation). Ici, nous définissons la valeur float sur 1f Car nous souhaitons que l'animation commence à augmenter la barre à partir du bas. Si nous voulions qu'il croisse de haut en bas, nous utiliserions 0f.

Enfin et tout aussi important, l’appel à anim.setFillAfter(true). Si vous souhaitez conserver le résultat de l'animation une fois l'animation terminée, vous devez l'exécuter sur l'animateur avant d'exécuter l'animation.

Donc dans votre cas, vous pouvez faire quelque chose comme ceci:

View v = findViewById(R.id.viewContainer);
scaleView(v, 0f, .6f);
108
Jazzer

essayez ce code pour créer une animation Scale sans utiliser xml

ScaleAnimation animation = new ScaleAnimation(fromXscale, toXscale, fromYscale, toYscale, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
47
ilango j

En XML, c’est ce que j’utilise pour obtenir le même résultat. Peut-être c'est plus intuitif.

scale_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android" >

<scale
    Android:duration="200"
    Android:fromXScale="1.0"
    Android:fromYScale="0.0"
    Android:pivotX="50%"
    Android:pivotY="100%"
    Android:toXScale="1.0"
    Android:toYScale="1.0" />

</set>

scale_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android" >

<scale
    Android:duration="200"
    Android:fromXScale="1.0"
    Android:fromYScale="1.0"
    Android:pivotX="50%"
    Android:pivotY="100%"
    Android:toXScale="1.0"
    Android:toYScale="0.0" />

</set>

Voir l'animation sur l'axe des X est de 1.0 -> 1.0 ce qui signifie que vous n’avez aucune mise à l’échelle dans cette direction et reste sur toute la largeur tandis que, sur l’axe Y, vous obtenez 0.0 -> 1.0 mise à l'échelle, comme indiqué dans le graphique de la question. J'espère que ça aide quelqu'un.

Certains voudront peut-être connaître le code Java comme on en voit un demandé.

Placez les fichiers d'animation dans le dossier anim, puis chargez et définissez les fichiers d'animation de la même manière.

Animation scaleDown = AnimationUtils.loadAnimation(youContext, R.anim.scale_down);
ImagView v = findViewById(R.id.your_image_view);
v.startAnimation(scaleDown);
44
Subin Sebastian

Utilisez cette méthode

Si vous voulez scale au quart (la moitié x, la moitié y)

view.animate().scaleX(0.5f).scaleY(0.5f)

Si vous voulez scale et allez en bas à droite

view.animate().scaleX(0.5f).scaleY(0.5f)
        .translationY((view.height/4).toFloat()).translationX((view.width/4).toFloat())

Si vous voulez déplacer vers haut utilisez (-view.height/4) Et pour gauche (-view.width/4)

Si vous voulez faire quelque chose après l'animation utilisez withEndAction(Runnable runnable) fonction.

Vous pouvez utiliser une autre propriété comme alpha et rotation

code complet

view.animate()
      .scaleX(0.5f).scaleY(0.5f)//scale to quarter(half x,half y)
      .translationY((view.height/4).toFloat()).translationX((view.width/4).toFloat())// move to bottom / right
      .alpha(0.5f) // make it less visible
      .rotation(360f) // one round turns
      .setDuration(1000) // all take 1 seconds
      .withEndAction(new Runnable() {
           @Override
           public void run() {
              //animation ended
           }
      });
6
Radesh

Redimensionnez en utilisant méthodes d'assistance et gestionnaires de début-répétition-fin comme ceci:

resize(
    view1,
    1.0f,
    0.0f,
    1.0f,
    0.0f,
    0.0f,
    0.0f,
    150,
    null,
    null,
    null);

  return null;
}

Méthodes d'assistance:

/**
 * Resize a view.
 */
public static void resize(
  View view,
  float fromX,
  float toX,
  float fromY,
  float toY,
  float pivotX,
  float pivotY,
  int duration) {

  resize(
    view,
    fromX,
    toX,
    fromY,
    toY,
    pivotX,
    pivotY,
    duration,
    null,
    null,
    null);
}

/**
 * Resize a view with handlers.
 *
 * @param view     A view to resize.
 * @param fromX    X scale at start.
 * @param toX      X scale at end.
 * @param fromY    Y scale at start.
 * @param toY      Y scale at end.
 * @param pivotX   Rotate angle at start.
 * @param pivotY   Rotate angle at end.
 * @param duration Animation duration.
 * @param start    Actions on animation start. Otherwise NULL.
 * @param repeat   Actions on animation repeat. Otherwise NULL.
 * @param end      Actions on animation end. Otherwise NULL.
 */
public static void resize(
  View view,
  float fromX,
  float toX,
  float fromY,
  float toY,
  float pivotX,
  float pivotY,
  int duration,
  Callable start,
  Callable repeat,
  Callable end) {

  Animation animation;

  animation =
    new ScaleAnimation(
      fromX,
      toX,
      fromY,
      toY,
      Animation.RELATIVE_TO_SELF,
      pivotX,
      Animation.RELATIVE_TO_SELF,
      pivotY);

  animation.setDuration(
    duration);

  animation.setInterpolator(
    new AccelerateDecelerateInterpolator());

  animation.setFillAfter(true);

  view.startAnimation(
    animation);

  animation.setAnimationListener(new AnimationListener() {

    @Override
    public void onAnimationStart(Animation animation) {

      if (start != null) {
        try {

          start.call();

        } catch (Exception e) {
          e.printStackTrace();
        }
      }

    }

    @Override
    public void onAnimationEnd(Animation animation) {

      if (end != null) {
        try {

          end.call();

        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }

    @Override
    public void onAnimationRepeat(
      Animation animation) {

      if (repeat != null) {
        try {

          repeat.call();

        } catch (Exception e) {
          e.printStackTrace();
        }
      }  
    }
  });
}
1
Zon
public void expand(final View v) {
        ScaleAnimation scaleAnimation = new ScaleAnimation(1, 1, 1, 0, 0, 0);
        scaleAnimation.setDuration(250);
        scaleAnimation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                v.setVisibility(View.INVISIBLE);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });
        v.startAnimation(scaleAnimation);
    }

    public void collapse(final View v) {
        ScaleAnimation scaleAnimation = new ScaleAnimation(1, 1, 0, 1, 0, 0);
        scaleAnimation.setDuration(250);
        scaleAnimation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                v.setVisibility(View.VISIBLE);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });
        v.startAnimation(scaleAnimation);
    }
0
Tomash VK