examples - transitions android example



Animación de la altura del contenedor LinearLayout con ValueAnimator (1)

Mirando esta publicación en el blog: http://tech.chitgoks.com/2011/10/29/android-animation-to-expand-collapse-view-its-children/ Descubrí que no debería usar view.invalidate() tener el diseño redibujado. Debería usar view.requestLayout() .

Por lo tanto, el código se convierte en algo como esto:

ValueAnimator va = ValueAnimator.ofInt(0, height);
    va.setDuration(700);
    va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        public void onAnimationUpdate(ValueAnimator animation) {
            Integer value = (Integer) animation.getAnimatedValue();
            v.getLayoutParams().height = value.intValue();
            v.requestLayout();
        }
    });

Solo quería agregar una nota sobre cómo obtener el alto de LinearLayout para que la animación sea dinámica. Para obtener la altura, todas las vistas deben dibujarse primero. Por eso tenemos que escuchar un evento que nos dice que el dibujo está hecho. Esto se puede hacer desde el método onResume () de esta manera (tenga en cuenta que en mi xml he declarado el contenedor para wrap_content para la altura y también está visible, ya que quiero ocultarlo desde el principio, lo hago midiéndolo):

@Override
    public void onResume() {
        super.onResume();
        final ViewTreeObserver vto = filterContainer.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                height = filterContainer.getHeight();
                filterContainer.setVisibility(View.GONE);
                filterContainer.getLayoutParams().height = 0;
                filterContainer.requestLayout();
                ViewTreeObserver obs = filterContainer.getViewTreeObserver();
                obs.removeGlobalOnLayoutListener(this);
            }
        });
    }

Tengo un LinearLayout que uso como contenedor para algunos botones y textview que me gustaría animar a la altura de para dar una impresión de que el diseño se desliza hacia abajo cuando el usuario presiona un botón "mostrar".

Establecí LinearLayout en layout_height = "0dp" y visibility = "ido" en mi xml. Luego deseo configurarlo para que sea visible y cualquier altura que sea necesaria para envolver el contenido. En este momento estoy teniendo problemas para animarlo, sin importar la altura del contenido del wrapper.

Aquí está mi método para animar:

private void toggle(final LinearLayout v) {
    v.setVisibility(View.VISIBLE);
    ValueAnimator va = ValueAnimator.ofInt(0, 300);
    va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        public void onAnimationUpdate(ValueAnimator animation) {
            Integer value = (Integer) animation.getAnimatedValue();
            v.getLayoutParams().height = value.intValue();
            v.invalidate();

        }
    });

    va.start();
}

Tal vez el problema es cómo estoy estableciendo el alto de LinearLayout. ¿O estoy malinterpretando la función del ValueAnimator? He revisado las publicaciones de blog de Chet Haase, pero no contienen ningún ejemplo de animación de altura específico. Tampoco he podido encontrar y buenos ejemplos de cómo trabajar con animaciones de alto usando API de 3.0+. Me gustaría algo de ayuda en esto, gracias!





android-linearlayout