Cómo hacer animaciones Check/Tick y Cross en Android

La clase AnimatedVectorDrawable se introdujo en la API 21 y se usa para animar Vector Drawables de manera hermosa y sencilla. Usando AnimatedVectorDrawable, uno puede:

  • Girar, escalar, traducir VectorDrawables
  • Anime el VectorDrawable como el color de relleno, etc.
  • Dibuja caminos y haz Path Morphing

Un elemento AnimatedVectorDrawable tiene un atributo VectorDrawable y uno o más elementos de destino. El elemento de destino puede especificar su destino mediante el atributo android:name y vincular el destino con el ObjectAnimator o AnimatorSet adecuado mediante el atributo android:animation .

Enfoque para dibujar la animación de Tick Cross:

  1. Cree un nuevo archivo tick_cross.xml en el directorio de valores y agregue los siguientes comandos de ruta y datos de ruta dibujables vectoriales:

    tick_cross.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <resources>
      
       <!-- geometry -->
       <integer name="viewport_width">24</integer>
       <integer name="viewport_height">24</integer>
       <integer name="viewport_center_x">12</integer>
       <integer name="viewport_center_y">12</integer>
       <string name="path_tick">M4.8, 13.4 L9, 
                                17.6 M10.4, 
                                16.2 L19.6, 7
       </string>
       <string name="path_cross">M6.4, 6.4 L17.6, 
                                17.6 M6.4, 
                                17.6 L17.6, 6.4
       </string>
       <integer name="stroke_width">2</integer>
      
       <!-- names -->
       <string name="tick">tick</string>
       <string name="cross">cross</string>
       <string name="groupTickCross">groupTickCross</string>
      
       <!-- drawing -->
       <color name="stroke_color">#999</color>
    </resources>
  2. Ahora cree un nuevo directorio de recursos de Android . Haga clic derecho en la carpeta res y seleccione Directorio de recursos de Android. Asegúrese de seleccionar el tipo de recurso como animador .
    Los animadores pueden cambiar las propiedades físicas de los objetos. Esto significa que si mueve una Vista a una nueva ubicación, las coordenadas táctiles se mapearán en la nueva ubicación sin ninguna otra intervención.
  3. Ahora cree un nuevo archivo cross_to_tick.xml en el directorio animador . En este archivo, definimos principalmente la duración y el tipo de animación para cross_to_tick.xml. Este archivo es responsable de la conversión de la cruz a una marca cuando el usuario hace clic en el icono de la cruz.

    cruzar_a_tick.xml

    <?xml version="1.0" encoding="utf-8"?>
    <objectAnimator
        android:propertyName="pathData"
        android:valueFrom="@string/path_cross"
        android:valueTo="@string/path_tick"
        android:duration="500"
        android:interpolator="@android:interpolator/fast_out_slow_in"
        android:valueType="pathType" />
  4. Ahora cree un nuevo archivo tick_to_cross.xml en el directorio animador . En este archivo, definimos principalmente la duración y el tipo de animación para tick_to_cross.xml. Este archivo es responsable de la conversión de la marca en cruz cuando el usuario hace clic en el icono de la marca.

    tick_to_cross.xml

    <?xml version="1.0" encoding="utf-8"?>
    <objectAnimator
        android:propertyName="pathData"
        android:valueFrom="@string/path_tick"
        android:valueTo="@string/path_cross"
        android:duration="500"
        android:interpolator="@android:interpolator/fast_out_slow_in"
        android:valueType="pathType"/>
  5. Ahora cree un nuevo archivo giratorio_cruz_a_tick.xml en el directorio animador . En este archivo, definimos principalmente la duración y el tipo de animación para tick_to_cross.xml. Este archivo es responsable de la rotación cuando el usuario hace clic en el icono de la cruz.

    rotar_cruz_a_tick.xml

    <?xml version="1.0" encoding="utf-8"?>
    <objectAnimator
        android:propertyName="rotation"
        android:valueFrom="-180"
        android:valueTo="0"
        android:duration="500"
        android:interpolator="@android:interpolator/fast_out_slow_in" />
  6. Ahora cree un nuevo archivo giratorio_tick_to_cross.xml en el directorio animador . En este archivo, definimos principalmente la duración y el tipo de animación para tick_to_cross.xml. Este archivo es responsable de la rotación cuando el usuario hace clic en el icono de marca.

    rotar_cruz_a_tick.xml

    <?xml version="1.0" encoding="utf-8"?>
    <objectAnimator
        android:propertyName="rotation"
        android:valueFrom="0"
        android:valueTo="180"
        android:duration="500"
        android:interpolator="@android:interpolator/fast_out_slow_in" />
  7. En los siguientes dos pasos, crearemos AnimatedVectorDrawable para cross_to_tick y tick_to_cross.

  8. Ahora cree un nuevo archivo avd_cross_to_tick.xml en el directorio dibujable y el siguiente código.

    avd_cross_to_tick.xml

    <?xml version="1.0" encoding="utf-8"?>
    <animated-vector
        android:drawable="@drawable/ic_cross">
      
        <target
            android:name="@string/cross"
            android:animation="@animator/cross_to_tick" />
      
        <target
            android:name="@string/groupTickCross"
            android:animation="@animator/rotate_cross_to_tick" />
      
    </animated-vector>
  9. Ahora cree un nuevo archivo avd_tick_to_cross.xml en el directorio dibujable y el siguiente código.

    avd_tick_to_cross.xml

    <?xml version="1.0" encoding="utf-8"?>
    <animated-vector
        android:drawable="@drawable/ic_tick">
      
        <target
            android:name="@string/tick"
            android:animation="@animator/tick_to_cross" />
      
      
        <target
            android:name="@string/groupTickCross"
            android:animation="@animator/rotate_tick_to_cross" />
      
    </animated-vector>
  10. En este paso, definiremos un objeto estático dibujable para gráficos vectoriales. Ahora cree un nuevo archivo ic_tick.xml en el directorio dibujable y el siguiente código.

    ic_tick.xml

    <?xml version="1.0" encoding="utf-8"?>
            android:width="120dp"
            android:height="120dp"
            android:viewportWidth="@integer/viewport_width"
            android:viewportHeight="@integer/viewport_height">
      
        <group
            android:name="@string/groupTickCross"
            android:pivotX="@integer/viewport_center_x"
            android:pivotY="@integer/viewport_center_y">
      
            <path
                android:name="@string/tick"
                android:pathData="@string/path_tick"
                android:strokeWidth="@integer/stroke_width"
                android:strokeLineCap="square"
                android:strokeColor="@color/stroke_color"/>
        </group>
    </vector>
  11. En este paso, definiremos un objeto estático dibujable para gráficos vectoriales. Ahora cree un nuevo archivo ic_cross.xml en el directorio dibujable y el siguiente código.

    ic_cross.xml

    <?xml version="1.0" encoding="utf-8"?>
            android:width="120dp"
            android:height="120dp"
            android:viewportWidth="@integer/viewport_width"
            android:viewportHeight="@integer/viewport_height">
      
        <group
            android:name="@string/groupTickCross"
            android:pivotX="@integer/viewport_center_x"
            android:pivotY="@integer/viewport_center_y">
      
            <path
                android:name="@string/cross"
                android:pathData="@string/path_cross"
                android:strokeWidth="@integer/stroke_width"
                android:strokeLineCap="square"
                android:strokeColor="@color/stroke_color"/>
      
        </group>
      
    </vector>
  12. Ahora agregue el siguiente código en el archivo activity_main.xml .

    actividad_principal.xml

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:onClick="animate"
        tools:context=".MainActivity">
      
        <ImageView
            android:id="@+id/tick_cross"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:src="@drawable/ic_tick" />
      
    </FrameLayout>
  13. Ahora agregue el siguiente código en el archivo MainActivity.xml .

    Actividad principal.xml

    package org.geeksforgeeks.tickcross;
      
    import androidx.appcompat.app.AppCompatActivity;
      
    import android.graphics.drawable.AnimatedVectorDrawable;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.ImageView;
      
    public class MainActivity extends AppCompatActivity {
      
        private ImageView tickCross;
        private AnimatedVectorDrawable tickToCross;
        private AnimatedVectorDrawable crossToTick;
        private boolean tick = true;
      
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tickCross = findViewById(R.id.tick_cross);
      
            tickToCross = (AnimatedVectorDrawable)
                getDrawable(
                    R.drawable.avd_tick_to_cross);
      
            crossToTick = (AnimatedVectorDrawable)
                getDrawable(
                    R.drawable.avd_cross_to_tick);
        }
        // This method help to animate our view.
        public void animate(View view)
        {
            AnimatedVectorDrawable drawable
                = tick
                      ? tickToCross
                      : crossToTick;
            tickCross.setImageDrawable(drawable);
            drawable.start();
            tick = !tick;
        }
    }

Producción:

Publicación traducida automáticamente

Artículo escrito por madhavmaheshwarimm20 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *