Collection d'animations Android entre animations


Introduction à cette section :

Cette section apporte la deuxième des trois animations dans Android - l'animation tween (Tween), qui est différente de l'animation frame apprise précédemment, l'animation frame Il simule les effets d'animation en lisant continuellement des images, et les développeurs d'animation interpolaire n'ont qu'à spécifier début de l'animation et fin de l'animation "images clés", Les « images intermédiaires » des changements d'animation sont calculées et complétées par le système ! D'accord, commençons cette section ~


1. Classification de l'animation d'interpolation et de l'interpolateur

Les effets d'animation d'interpolation pris en charge par Andoird sont les suivants, ou Parlons de quatre types. . Le cinquième n'est qu'une combinaison des précédents~

  • AlphaAnimation : Effet de dégradé de transparence, vous pouvez spécifier la transparence de début et de fin lors de la création, et aussi. Durée animée Temps, plage de transparence (0,1), 0 est complètement transparent, 1 est complètement opaque correspondant à la balise <alpha/>
  • ScaleAnimation : effet de dégradé d'échelle lors de la création, vous devez spécifier le rapport de mise à l'échelle de début et de fin, ainsi que le point de référence de mise à l'échelle. Il y a aussi la durée de l'animation correspondant à la balise <scale/>
  • TranslateAnimation : effet de dégradé de déplacement, précisez les positions de début et de fin lors de la création, et précisez la durée de l'animation Réglez simplement l'heure ; correspond à la balise <translate/>
  • RotateAnimation : effet de dégradé de rotation, précise l'angle de rotation de début et de fin de l'animation lors de la création, ainsi que l'animation Durée et axe de rotation ; correspondant à la balise <rotate/>
  • AnimationSet : dégradé combiné, qui est une combinaison des dégradés précédents, correspondant à < ; set/> tag

Avant de commencer à expliquer l'utilisation de diverses animations, nous devons d'abord expliquer une chose : Interpolateur

est utilisé pour contrôler la vitesse de changement de l'animation. Il peut être compris comme un moteur de rendu d'animation. Bien sûr, nous pouvons également implémenter Interpolator nous-mêmes. Interface, vous pouvez contrôler vous-même la vitesse de changement d'animation, et Android nous a fourni cinq classes d'implémentation parmi lesquelles choisir :

  • LinearInterpolator : L'animation change à une vitesse uniforme
  • AccelerateInterpolator : L'animation change lentement là où elle commence, puis commence à accélérer
  • AccelerateDecelerateInterpolator : La vitesse change lentement au début et à la fin de l'animation, et accélère au milieu
  • CycleInterpolator : L'animation boucle pour un spécifique. nombre de fois, et la vitesse de changement est sinusoïdale. La courbe change : Math.sin(2 * mCycles * Math.PI * input)
  • DecelerateInterpolator : Change plus rapidement au début de l'animation, puis commence à ralentir
  • AnticipateInterpolator : Inverser, changez d'abord une section dans le sens opposé, puis accélèrez la lecture
  • AnticipateOvershootInterpolator : Commencez en arrière, puis avancez une certaine valeur et revenez à la finale value
  • BounceInterpolator : Jump La valeur sautera lorsqu'elle atteindra la valeur cible. Par exemple, la valeur cible est 100 et les valeurs suivantes peuvent être 85, 77, 70. , 80, 90, 100
  • OvershottInterpolator : rebond, enfin dépasser la valeur cible puis passer lentement à la valeur cible

Et cette chose, nous avons généralement utilisez-le lors de l'écriture de fichiers XML d'animation, l'attribut est :android:interpolator, La valeur correspondante ci-dessus est : @android:anim/linear_interpolator, qui est en fait la nomenclature des cas de chameaux modifiée pour être soulignée. AccelerateDecelerateInterpolator correspond à : @android:anim/accelerate_decelerate_interpolator !


2. Explication détaillée des différentes animations

Le android:duration voici la durée de l'animation, l'unité est en millisecondes~


1) AlphaAnimation (dégradé de transparence)

anim_alpha.xml :

<alpha xmlns:android="http://schemas.android.com/apk/res/android"  
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
    android:fromAlpha="1.0"  
    android:toAlpha="0.1"  
    android:duration="2000"/>

Explication de l'attribut :

fromAlpha : Début de la transparence
toAlpha : Fin de la transparence
La plage de transparence est : 0-1, complètement transparente - complètement opaque


2) ScaleAnimation (dégradé d'échelle)

anim_scale.xml :

<scale xmlns:android="http://schemas.android.com/apk/res/android"  
    android:interpolator="@android:anim/accelerate_interpolator"  
    android:fromXScale="0.2"  
    android:toXScale="1.5"  
    android:fromYScale="0.2"  
    android:toYScale="1.5"  
    android:pivotX="50%"  
    android:pivotY="50%"  
    android:duration="2000"/>

Explication de l'attribut :

  • fromXScale/fromYScale : Le rapport de départ de mise à l'échelle le long de l'axe X/Y
  • toXScale/ toYScale : La proportion finale de mise à l'échelle le long de la position du bord, par exemple 50 %, est basée sur l'image Le centre est le point de l'axe central
  • 3) TranslateAnimation (gradient de déplacement)

anim_translate.xml

:
<translate xmlns:android="http://schemas.android.com/apk/res/android"  
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
    android:fromXDelta="0"  
    android:toXDelta="320"  
    android:fromYDelta="0"  
    android:toYDelta="0"  
    android:duration="2000"/>
Explication de la propriété :

fromXDelta

/

fromYDelta
 : coordonnées X/Y de la position de départ de l'animation
  • toXDelta/toYDelta : coordonnées X/Y de la position finale de l'animation
  • 4) RotateAnimation (dégradé de rotation)

anim_rotate.xml

 :
<rotate xmlns:android="http://schemas.android.com/apk/res/android"  
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
    android:fromDegrees="0"  
    android:toDegrees="360"  
    android:duration="1000"  
    android:repeatCount="1"  
    android:repeatMode="reverse"/>
Explication de l'attribut :

  • fromDegrees/toDegrees : l'angle de début/fin de la rotation
  • repeatCount : le nombre de rotations, La valeur par défaut est 0, ce qui représente une fois. S'il s'agit d'une autre valeur, telle que 3, il tourne 4 fois. De plus, lorsque la valeur est -1 ou infinie, cela signifie que l'animation ne s'arrêtera jamais
  • repeatMode : Définissez le mode de répétition, la valeur par défaut est restart, mais seulement lorsque RepeatCount est supérieur à 0 ou infini ou -1 heure est efficace. Vous pouvez également le régler sur inverse, ce qui signifie que lorsque l'animation est affichée plusieurs fois, elle se déplacera dans la direction opposée !

5) AnimationSet (combinaison dégradé)

C'est très simple, c'est juste une combinaison des animations précédentes~

anim_set.xml

  
  <set xmlns:android="http://schemas.android.com/apk/res/android"  
    android:interpolator="@android:anim/decelerate_interpolator"  
    android:shareInterpolator="true" >  
  
    <scale  
        android:duration="2000"  
        android:fromXScale="0.2"  
        android:fromYScale="0.2"  
        android:pivotX="50%"  
        android:pivotY="50%"  
        android:toXScale="1.5"  
        android:toYScale="1.5" />  
  
    <rotate  
        android:duration="1000"  
        android:fromDegrees="0"  
        android:repeatCount="1"  
        android:repeatMode="reverse"  
        android:toDegrees="360" />  
  
    <translate  
        android:duration="2000"  
        android:fromXDelta="0"  
        android:fromYDelta="0"  
        android:toXDelta="320"  
        android:toYDelta="0" />  
  
    <alpha  
        android:duration="2000"  
        android:fromAlpha="1.0"  
        android:toAlpha="0.1" />
</set>

3. Écrivez un exemple pour en faire l'expérience

D'accord, écrivons un exemple en utilisant l'animation écrite ci-dessus. Comprenons quoi. l'animation interpolaire est : Commençons par une mise en page simple : activity_main.xml :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn_alpha"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="透明度渐变" />

    <Button
        android:id="@+id/btn_scale"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="缩放渐变" />

    <Button
        android:id="@+id/btn_tran"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="位移渐变" />

    <Button
        android:id="@+id/btn_rotate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="旋转渐变" />

    <Button
        android:id="@+id/btn_set"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="组合渐变" />

    <ImageView
        android:id="@+id/img_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="48dp"
        android:src="@mipmap/img_face" />
    </LinearLayout>

Ok, puis allez dans notre MainActivity.java, qui est également très simple, appelez simplement AnimationUtils. chargerAnimation() Chargez l'animation, puis notre contrôle View appelle startAnimation pour démarrer l'animation~

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private Button btn_alpha;
    private Button btn_scale;
    private Button btn_tran;
    private Button btn_rotate;
    private Button btn_set;
    private ImageView img_show;
    private Animation animation = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bindViews();
    }

    private void bindViews() {
        btn_alpha = (Button) findViewById(R.id.btn_alpha);
        btn_scale = (Button) findViewById(R.id.btn_scale);
        btn_tran = (Button) findViewById(R.id.btn_tran);
        btn_rotate = (Button) findViewById(R.id.btn_rotate);
        btn_set = (Button) findViewById(R.id.btn_set);
        img_show = (ImageView) findViewById(R.id.img_show);

        btn_alpha.setOnClickListener(this);
        btn_scale.setOnClickListener(this);
        btn_tran.setOnClickListener(this);
        btn_rotate.setOnClickListener(this);
        btn_set.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_alpha:
                animation = AnimationUtils.loadAnimation(this,
                        R.anim.anim_alpha);
                img_show.startAnimation(animation);
                break;
            case R.id.btn_scale:
                animation = AnimationUtils.loadAnimation(this,
                        R.anim.anim_scale);
                img_show.startAnimation(animation);
                break;
            case R.id.btn_tran:
                animation = AnimationUtils.loadAnimation(this,
                        R.anim.anim_translate);
                img_show.startAnimation(animation);
                break;
            case R.id.btn_rotate:
                animation = AnimationUtils.loadAnimation(this,
                        R.anim.anim_rotate);
                img_show.startAnimation(animation);
                break;
            case R.id.btn_set:
                animation = AnimationUtils.loadAnimation(this,
                        R.anim.anim_set);
                img_show.startAnimation(animation);
                break;
        }
    }
}

Exécutez le rendu  :

1.gif

Hé, c'est un peu je veux dire, ne l'essayez pas encore, changez quelque chose ou combinez librement des animations pour créer des effets sympas ~


4. Surveillance de l'état de l'animation

Nous. peut surveiller l'état d'exécution de l'animation, appeler la méthode de l'objet d'animation :

  • setAnimationListener(new AnimationListener()) et réécrire les trois méthodes suivantes :
  • onAnimationStart() : L'animation démarre
  • onAnimtaionRepeat() : L'animation se répète
  • onAnimationEnd () : Après l'animation

, vous pouvez compléter la surveillance de l'état d'exécution de l'animation ~


5. Définir dynamiquement l'effet d'animation pour la vue

<. 🎜> Appelez d'abord

AnimationUtils.loadAnimation (fichier XML d'animation), puis le contrôle View appelle startAnimation(anim) Démarrer l'animation ~ Il s'agit d'une méthode de chargement statique. Bien entendu, vous pouvez également créer directement un objet d'animation, compléter les paramètres avec du code Java, puis appeler. startAnimation active l'animation ~


6. Définir l'animation de transition pour Fragment

Une chose à noter ici est de savoir si Fragment utilise le

package v4 ou Fragment sous le package d'application ! Nous pouvons appeler setTransition(int transit) de l'objet FragmentTransaction pour spécifier une animation de transition standard pour Fragment. Les valeurs facultatives pour le transit sont les suivantes :

.
  • TRANSIT_NONE : Aucune animation
  • TRANSIT_FRAGMENT_OPEN : Animation de formulaire ouvert
  • TRANSIT_FRAGMENT_CLOSE : Animation de fermeture de formulaire
Les deux animations de processus standard ci-dessus peuvent être appelées, mais la différence réside dans l'animation de transition personnalisée

Méthode

setCustomAnimations() !

  • Fragment sous le package de l'application : setCustomAnimations(int enter, int exit, int popEnter, int popExit) sont ajoutés et supprimés respectivement. , poussez dans la pile et animation lorsque vous sortez de la pile ! Une autre chose à noter est que le type d'animation correspondant est : property animation (Property), qui est le fichier d'animation La balise racine doit être : <objectAnimator>, <valueAnimator> ou les deux premières sont placées dans un <set>;

  • Fragment sous le package v4 : Le package v4 prend en charge deux types de setCustomAnimations()

2.png

Une autre chose à noter est que le type d'animation correspondant est : Tween animation ), le même que la vue ci-dessus~

Vous pouvez avoir des doutes sur la façon dont vous connaissez le type d'animation correspondant. En fait, à condition d'aller dans le code source du Fragment et de rechercher :

L'un des onCreateAnimation. () méthodes Vous connaîtrez la valeur de retour :

package v4  :

3.png

package d'application  :

4.png


7. Définir des cinématiques pour l'activité

Activty est très simple pour définir des cinématiques. La méthode d'appel est : overridePendingTransition( int enterAnim, int exitAnim)

l'utilisation est très simple : ajoutez après startActivity(intent) ou

finish()

et les paramètres sont : Nouvelle activité L'animation lors de l'entrée , et l'animation lorsque l'ancienne activité sort

Voici plusieurs animations cinématiques relativement simples et couramment utilisées que tout le monde peut utiliser~

5.png

Portail de téléchargement : Activité commune de transition animation.zip


8. Écrivez un bouton d'inscription de connexion après être entré dans l'application à partir de Exemple d'effet d'animation pop-up inférieur :

Rendu en cours d'exécution  :

6.gif

Implémentation du code  :

Le premier est notre fichier de mise en page : activity_main.xml :

  <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:background="#DDE2E3"
    tools:context=".MainActivity">

    <LinearLayout
        android:id="@+id/start_ctrl"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="vertical"
        android:visibility="gone">

        <Button
            android:id="@+id/start_login"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#F26968"
            android:gravity="center"
            android:paddingBottom="15dp"
            android:paddingTop="15dp"
            android:text="登陆"
            android:textColor="#FFFFFF"
            android:textSize="18sp" />

        <Button
            android:id="@+id/start_register"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#323339"
            android:gravity="center"
            android:paddingBottom="15dp"
            android:paddingTop="15dp"
            android:text="注册"
            android:textColor="#FFFFFF"
            android:textSize="18sp" />
    </LinearLayout></RelativeLayout>

suivi de MainActivity.java :

public class MainActivity extends AppCompatActivity {
    private LinearLayout start_ctrl;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        start_ctrl = (LinearLayout) findViewById(R.id.start_ctrl);
        //设置动画,从自身位置的最下端向上滑动了自身的高度,持续时间为500ms
        final TranslateAnimation ctrlAnimation = new TranslateAnimation(
                TranslateAnimation.RELATIVE_TO_SELF, 0, TranslateAnimation.RELATIVE_TO_SELF, 0,
                TranslateAnimation.RELATIVE_TO_SELF, 1, TranslateAnimation.RELATIVE_TO_SELF, 0);
        ctrlAnimation.setDuration(500l);     //设置动画的过渡时间
        start_ctrl.postDelayed(new Runnable() {
            @Override
            public void run() {
                start_ctrl.setVisibility(View.VISIBLE);
                start_ctrl.startAnimation(ctrlAnimation);
            }
        }, 2000);
    }
}

Le commentaire est très clair, donc je ne l'expliquerai pas ici. Si vous avez des doutes sur TranslateAnimation.RELATIVE_TO_SELF, Veuillez rechercher Google ou Baidu vous-même. En raison du manque d'espace (je suis paresseux), je ne l'écrirai pas ici. C'est assez simple ~7.gif


9.

AnimationDemo3.zip

AnimationDemo4.zip


Résumé de cette section :

Cette section vous donne les détails. Elle explique le deuxième type d'animation sous Android (animation dégradée), l'explication détaillée des quatre types d'animation et Définir les écouteurs d'animation et comment définir les animations pour la vue, le fragment et l'activité, et enfin écrire une post-entrée L'exemple de l'apparition du bouton de connexion et du bouton d'enregistrement en bas de l'application est peut-être un peu long, mais il est très facile à comprendre. Tout le monde gagnera beaucoup après avoir lu ceci~ ! D'accord, c'est tout pour cette section, merci~