Afficher l'animation

Vous pouvez utiliser le système d'animation des vues pour effectuer une animation d'interpolation sur les vues. L'animation d'interpolation calcule l'animation à l'aide d'informations telles que le point de départ, le point de fin, la taille, la rotation et d'autres aspects courants d'une animation.

Une animation d'interpolation peut effectuer une série de transformations simples (position, taille, rotation et transparence) sur le contenu d'un objet View. Ainsi, si vous disposez d'un objet TextView, vous pouvez déplacer, faire pivoter, augmenter ou réduire le texte. Si elle dispose d'une image de fond, elle est transformée en même temps que le texte. animation package fournit toutes les classes utilisées dans une animation d'interpolation.

Une séquence d'instructions d'animation définit l'animation d'interpolation, définie par du code XML ou Android. Comme pour la définition d'une mise en page, nous vous recommandons d'utiliser un fichier XML, car il est plus lisible, réutilisable et interchangeable que le codage en dur de l'animation. Dans l'exemple ci-dessous, nous utilisons le format XML. (Pour en savoir plus sur la définition d'une animation dans le code d'application au lieu de XML, consultez la classe AnimationSet et les autres sous-classes Animation.)

Les instructions d'animation définissent les transformations que vous souhaitez exécuter, le moment où elles se produisent et le temps nécessaire à leur application. Les transformations peuvent être séquentielles ou simultanées. Par exemple, vous pouvez faire en sorte que le contenu d'un TextView se déplace de gauche à droite, puis faire pivoter de 180 degrés, ou vous pouvez faire en sorte que le texte se déplace et pivote simultanément. Chaque transformation nécessite un ensemble de paramètres spécifiques à cette transformation (taille de départ et de fin pour le changement de taille, angle de début et angle de fin pour la rotation, etc.), ainsi qu'un ensemble de paramètres communs (par exemple, l'heure de début et la durée). Pour que plusieurs transformations se produisent simultanément, attribuez-leur la même heure de début. Pour les rendre séquentielles, calculez l'heure de début plus la durée de la transformation précédente.

Le fichier XML d'animation appartient au répertoire res/anim/ de votre projet Android. Le fichier doit comporter un seul élément racine: il s'agit d'un seul élément <alpha>, <scale>, <translate>, <rotate>, d'un interpolateur ou d'un élément <set> contenant des groupes de ces éléments (qui peuvent inclure une autre <set>). Par défaut, toutes les instructions d'animation sont appliquées simultanément. Pour que celles-ci se produisent de manière séquentielle, vous devez spécifier l'attribut startOffset, comme indiqué dans l'exemple ci-dessous.

Le code XML suivant provenant de l'une des ApiDemos est utilisé pour étirer, puis faire pivoter et faire pivoter simultanément un objet View.

<set android:shareInterpolator="false">
    <scale
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:fromXScale="1.0"
        android:toXScale="1.4"
        android:fromYScale="1.0"
        android:toYScale="0.6"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fillAfter="false"
        android:duration="700" />
    <set android:interpolator="@android:anim/decelerate_interpolator">
        <scale
           android:fromXScale="1.4"
           android:toXScale="0.0"
           android:fromYScale="0.6"
           android:toYScale="0.0"
           android:pivotX="50%"
           android:pivotY="50%"
           android:startOffset="700"
           android:duration="400"
           android:fillBefore="false" />
        <rotate
           android:fromDegrees="0"
           android:toDegrees="-45"
           android:toYScale="0.0"
           android:pivotX="50%"
           android:pivotY="50%"
           android:startOffset="700"
           android:duration="400" />
    </set>
</set>

Les coordonnées de l'écran (non utilisées dans cet exemple) sont (0,0) dans l'angle supérieur gauche et augmentent à mesure que vous descendez et vers la droite.

Certaines valeurs, telles que pivotX, peuvent être spécifiées par rapport à l'objet lui-même ou par rapport au parent. Veillez à utiliser le bon format pour obtenir le résultat souhaité ("50" pour 50% par rapport au parent ou "50%" pour 50% par rapport à lui-même).

Vous pouvez déterminer comment une transformation est appliquée au fil du temps en attribuant un Interpolator. Android inclut plusieurs sous-classes d'interpolateur qui spécifient différentes courbes de vitesse: par exemple, AccelerateInterpolator indique à une transformation de démarrer lentement et d'accélérer. Chacun d'entre eux possède une valeur d'attribut pouvant être appliquée dans le fichier XML.

Une fois ce fichier XML enregistré en tant que hyperspace_jump.xml dans le répertoire res/anim/ du projet, le code suivant le référencera et l'appliquera à un objet ImageView de la mise en page.

Kotlin

AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump).also { hyperspaceJumpAnimation ->
    findViewById<ImageView>(R.id.spaceshipImage).startAnimation(hyperspaceJumpAnimation)
}

Java

ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);
Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
spaceshipImage.startAnimation(hyperspaceJumpAnimation);

Au lieu d'utiliser startAnimation(), vous pouvez définir une heure de début pour l'animation avec Animation.setStartTime(), puis attribuer l'animation à la vue avec View.setAnimation().

Pour en savoir plus sur la syntaxe XML, les balises et les attributs disponibles, consultez la page Ressources d'animation.

Remarque:Quelle que soit la façon dont votre animation peut être déplacée ou redimensionnée, les limites de la vue qui la contient ne s'ajustent pas automatiquement pour s'y adapter. Malgré cela, l'animation sera toujours dessinée au-delà des limites de sa vue et ne sera pas rognée. Toutefois, le rognage se produira si l'animation dépasse les limites de la vue parent.