Android: slideUp y slideDown de views

Este código lo usé hace un par de años y lo tenía como borrador en el panel de WordPress porque supongo que en su día quería escribir algo, acabo de darme cuenta y por eso lo publico.

Con él se pueden preparar acordeones o zonas de información adicional que en primera instancia estén ocultas, por ejemplo. Me gustaría poder escribir algo más sobre esto, pero en realidad es suficientemente sencillo, tanto el código como el concepto, así que no puedo decir gran cosa : )

public static void slideDown(final View v) {
    v.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    final int targetHeight = v.getMeasuredHeight();

    // En versiones anteriores a la 21, si el alto es < 1 se detiene la animación:
    v.getLayoutParams().height = 1;

    v.setVisibility(View.VISIBLE);

    Animation a = new Animation(){
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            v.getLayoutParams().height = interpolatedTime == 1 ? ViewGroup.LayoutParams.WRAP_CONTENT : (int)(targetHeight * interpolatedTime);
            v.requestLayout();
        }

        @Override
        public boolean willChangeBounds() {
            return true;
        }
    };

    int dps = (int)(targetHeight / v.getContext().getResources().getDisplayMetrics().density);

    a.setInterpolator(new AccelerateDecelerateInterpolator());
    a.setDuration(4 * dps);
    v.startAnimation(a);
}
public static void slideUp(final View v) {
    final int initialHeight = v.getMeasuredHeight();

    Animation a = new Animation(){
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            if(interpolatedTime == 1){
                v.setVisibility(View.GONE);
            }else{
                v.getLayoutParams().height = initialHeight - (int)(initialHeight * interpolatedTime);
                v.requestLayout();
            }
        }

        @Override
        public boolean willChangeBounds() {
            return true;
        }
    };

    int dps = (int)(initialHeight / v.getContext().getResources().getDisplayMetrics().density);

    a.setInterpolator(new AccelerateDecelerateInterpolator());
    a.setDuration(4 * dps);

    v.startAnimation(a);
}



Josep Viciana

Programador de 28 años con una década de experiencia como programador. interesado en el diseño, ilustración y nuevas tecnologías. Dedicado desde siempre a la programación Web y desde hace algunos años también a la móvil.

No hay comentarios


Puedes dejar el primero : )



Deja un comentario

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