style implementing google example bottomnavigation bottom bar android animation views

android - implementing - Animación individual-Vistas múltiples



com google android material bottomnavigation bottomnavigationview (4)

¿Hay alguna forma de animar múltiples vistas al mismo tiempo?

Lo que quiero hacer es traducir animaciones:

Tengo 5 TextViews y 4 tiras de colores (RelativeLayouts con un fondo). Al comienzo de las animaciones, los stips se apilan con las TextViews en una fila horizontal. Al final quiero que todas las vistas de texto se apilen entre las tiras:

Este es un dibujo muy simple, pero demuestra lo que quiero hacer. ¿Hay alguna forma de hacer esto con animaciones, o tengo que usar animaciones de lienzo?


He logrado compartir una única instancia de animación entre varias vistas. Al menos con un AlphaAnimation. Tenía un ListView y una animación que deberían aplicarse a un elemento secundario particular de todas las vistas de elementos de la lista. En mi caso, debería haber sido posible que las vistas se ''unieran'' y ''dejaran'' la animación compartida en cualquier momento y no debería afectar a otras vistas animadas de ninguna manera ni interferir con la animación que ya se está ejecutando. Para lograr esto, tuve que hacer una copia ajustada de AlphaAnimation de Android. Mi caso de uso es bastante especial, pero deje que esté aquí en caso de que alguien tenga que lidiar con un objetivo similar con ListView.

/** * This class is a copy of android''s stock AlphaAnimation with two adjustments: * - fromAlpha, toAlpha and duration are settable at any time. * - reset() method can be blocked. Reason: view.setAnimation() calls animation''s reset() method * which is not intended in our use case. * For every new list item view we call setAnimation once for it''s life time * and animation should not be reset because it is shared by all list item views and may be in progress. */ public class MutableAlphaAnimation extends Animation { private float mFromAlpha; private float mToAlpha; private boolean resetBlocked; public MutableAlphaAnimation() { } public void start(float fromAlpha, float toAlpha, long duration) { mFromAlpha = fromAlpha; mToAlpha = toAlpha; setDuration(duration); setStartTime(START_ON_FIRST_FRAME); } public void setResetBlocked(boolean resetBlocked) { this.resetBlocked = resetBlocked; } @Override public void reset() { if (! resetBlocked) super.reset(); } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { final float alpha = mFromAlpha; t.setAlpha(alpha + ((mToAlpha - alpha) * interpolatedTime)); } @Override public boolean willChangeTransformationMatrix() { return false; } @Override public boolean willChangeBounds() { return false; } }

Para configurar esta animación a una vista:

animation.setResetBlocked(true); view.setAnimation(animation); animation.setResetBlocked(false);

Y para comenzar una animación (previamente establecida por setAnimation) DOS cosas deben hacerse:

animation.start(0.0f, 1.0f, FADE_IN_DURATION);

Y después de eso, debe invocar manualmente invalidar () en todas las vistas afectadas por la animación.

El habitual startAnimation () invalida () para usted, pero setAnimation no lo hace. (lea el comentario sobre el método View.setAnimation () en las fuentes de Android).


Puede usar el ObjectAnimator para animar la vista múltiple de la siguiente manera:

ArrayList<ObjectAnimator> arrayListObjectAnimators = new ArrayList<ObjectAnimator>(); //ArrayList of ObjectAnimators ObjectAnimator animY = ObjectAnimator.ofFloat(view, "y", 100f); arrayListObjectAnimators.add(animY); ObjectAnimator animX = ObjectAnimator.ofFloat(view, "x", 0f); arrayListObjectAnimators.add(animX); ... ObjectAnimator[] objectAnimators = arrayListObjectAnimators.toArray(new ObjectAnimator[arrayListObjectAnimators.size()]); AnimatorSet animSetXY = new AnimatorSet(); animSetXY.playTogether(objectAnimators); animSetXY.setDuration(1000);//1sec animSetXY.start();


Puedes usar AnimationSet

AnimatorSet decSet2 = new AnimatorSet(); decSet2.playTogether( ObjectAnimator.ofFloat(view, "x",dX), ObjectAnimator.ofFloat(view, "y",dY), ObjectAnimator.ofFloat(mTextCancel, "x",dX), ObjectAnimator.ofFloat(mTextCancel, "y", dY), ObjectAnimator.ofArgb(mBtnOne, "visibility", View.VISIBLE, View.GONE), ); decSet2.setDuration(0); decSet2.start();


Cree sus objetos de animación, luego use startAnimation colectivamente en todas las vistas al mismo tiempo. Entonces sería algo así:

TranslateAnimation anim1; TranslateAnimation anim2; TranslateAnimation anim3; // Setup the animation objects public void startAnimations() { //... collect view objects view1.startAnimation(anim1); view2.startAnimation(anim2); view3.startAnimation(anim3); }

Solo tenga en cuenta que cuantas más animaciones tenga al mismo tiempo, más lentas serán.