Invertir la animación de transformación de flecha a marca de verificación

Estoy tratando de lograr el efecto de morphing, cuando el usuario hace clic en myButton, la imagen dentro de ImageView debe morph de flecha a marca de verificación. Y cuando haga clic de nuevo, el proceso debe invertir: la marca de verificación debe morph a flecha.

Esto es lo que he hecho:

Animated_vector.xml:

<?xml version="1.0" encoding="utf-8"?> <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/vector_upvote"> <target android:name="rotationGroup" android:animation="@anim/rotate_a_to_b" /> <target android:name="upvote" android:animation="@animator/animator_upvote_to_checkmark" /> </animated-vector> 

Animator_upvote_to_checkmark.xml:

 <objectAnimator android:duration="250" android:propertyName="pathData" android:valueFrom="@string/svg_upvote" android:valueTo="@string/svg_checkmark" android:valueType="pathType" android:repeatMode="reverse" /> 

Y así es como juego la animación:

  Drawable drawable = upVote.getDrawable(); if (drawable instanceof Animatable) { ((Animatable) drawable).start(); } 

Esto transforma la flecha en marca de verificación, ¿cómo puedo invertir el proceso?

Si su opinión es checkable y también su minsdk > 21 usted puede intentar usar StateListAnimator con AnimatedVectorDrawable pero porque el appcompat ahora apoya vectorDrawable y AnimatedVectorDrawable y también tiene una limitación en usar todos DrawableContainers que no tomo por encima del acercamiento.

Así que permítanme decirles lo que puede funcionar:

DrawableContainers que hacen referencia a otros recursos desplegables que contienen sólo un recurso vectorial. Por ejemplo, un StateListDrawable que hace referencia a otros archivos que contienen un vector.

De Chris Banes

Con el fin de lograr que voy a crear personalizado ImageView y cada vez que se hace clic en usted debe llamar morph función para ejecutar vectorAnimatorDrawable adecuado.

Así código y demo:

Introduzca aquí la descripción de la imagen

 public class ArrowToCheckMarkMorphingImageView extends ImageView { private AnimatedVectorDrawable mArrowToCheckMark; private AnimatedVectorDrawable mCheckMarkToArrow; private boolean mIsShowingCheckMark; public ArrowToCheckMarkMorphingImageView(Context context) { super(context); init(); } public ArrowToCheckMarkMorphingImageView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public ArrowToCheckMarkMorphingImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } public ArrowToCheckMarkMorphingImageView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(); } public void init(){ mIsShowingCheckMark = false; mArrowToCheckMark = (AnimatedVectorDrawable)getContext().getDrawable(R.drawable.arrow_to_checkmark); mCheckMarkToArrow = (AnimatedVectorDrawable)getContext().getDrawable(R.drawable.checkmark_to_arrow); setImageDrawable(mArrowToCheckMark); } public void morph(){ final AnimatedVectorDrawable drawable = mIsShowingCheckMark ? mCheckMarkToArrow : mArrowToCheckMark; setImageDrawable(drawable); drawable.start(); mIsShowingCheckMark = !mIsShowingCheckMark; } } 

Y MainActivity :

 public class MainActivity extends AppCompatActivity { ArrowToCheckMarkMorphingImageView mArrowToCheckMarkImageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); mArrowToCheckMarkImageView = (ArrowToCheckMarkMorphingImageView)findViewById(R.id.imageView); mArrowToCheckMarkImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mArrowToCheckMarkImageView.morph(); } }); } } 

En el archivo de diseño debe utilizarlo como:

  <yourpackage.ArrowToCheckMarkMorphingImageView android:id="@+id/imageView" android:layout_width="50dp" android:layout_height="50dp" android:layout_centerInParent="true" /> 

Y recursos para aquellos que quieran darle una oportunidad:

Res / animador / arrow_to_checkmark

 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:duration="500" android:propertyName="pathData" android:valueFrom="M7.41,15.41 L12,10.83 l4.59,4.58 L18,14 18,14 l-6,-6 -6,6z" android:valueTo ="M9,16.17 L4.83,12 l-1.42,1.41 L9,19 21,7 l-1.41,-1.41 0,0z" android:valueType="pathType" /> <objectAnimator android:duration="500" android:propertyName="fillColor" android:valueFrom="#FF0000FF" android:valueTo="#FF00FF00" /> </set> 

Res / animator / checkmark_to_arrow

 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:duration="500" android:propertyName="pathData" android:valueFrom="M9,16.17 L4.83,12 l-1.42,1.41 L9,19 21,7 l-1.41,-1.41 0,0z" android:valueTo ="M7.41,15.41 L12,10.83 l4.59,4.58 L18,14 18,14 l-6,-6 -6,6z" android:valueType="pathType" /> <objectAnimator android:duration="500" android:propertyName="fillColor" android:valueFrom="#FF00FF00" android:valueTo="#FF0000FF" /> </set> 

Res / drawable / arrow_to_checkmark

 <?xml version="1.0" encoding="utf-8"?> <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/ic_arrow_up_24dp"> <target android:animation="@animator/arrow_to_checkmark" android:name="arrow"/> </animated-vector> 

Res / drawable / checkmark_to_arrow

 <?xml version="1.0" encoding="utf-8"?> <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/ic_checkmark_24dp"> <target android:animation="@animator/checkmark_to_arrow" android:name="checkmark"/> </animated-vector> 

Res / drawable / ic_arrow_up_24dp

 <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24.0" android:viewportHeight="24.0"> <path android:name="arrow" android:fillColor="#FF0000FF" android:pathData="M7.41,15.41 L12,10.83 l4.59,4.58 L18,14 18,14 l-6,-6 -6,6z"/> </vector> 

Res / drawable / ic_checkmark_24dp

 <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24.0" android:viewportHeight="24.0"> <path android:name="checkmark" android:fillColor="#FF00FF00" android:pathData="M9,16.17 L4.83,12 l-1.42,1.41 L9,19 21,7 l-1.41,-1.41 0,0z"/> </vector> 

Voy a ir con el botón de progreso circular, se puede personalizar en función de su necesidad o ampliar la biblioteca (ya que es de código abierto). He estado usando eso por un tiempo y es bastante fácil de integrar en sus proyectos.

Además, puedes aprender de eso y crear tu propia biblioteca 🙂

Aquí el repositorio de Git CircularProgressButton

Introduzca aquí la descripción de la imagen

Además, puede probar otro excelente código abierto, como Android Morphing Button

Introduzca aquí la descripción de la imagen Introduzca aquí la descripción de la imagen

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.