Android: cómo mantener la relación de aspecto en la animación

La animación que estoy ejecutando dentro de una vista de imagen se niega a mantener la relación de aspecto de los fotogramas de la imagen. Las siguientes respuestas en SO son bastante informativas, pero no parecen funcionar para mí: Cómo escalar una imagen en ImageView para mantener la relación de aspecto

Aquí está el código:

private void startAnimation(){
    mImageView.setAdjustViewBounds(true);
    mImageView.setScaleType(ScaleType.CENTER);
    mImageView.setBackgroundResource(R.anim.my_animation);

    AnimationDrawable frameAnimation = (AnimationDrawable) mImageView.getBackground();

     // Start the animation (looped playback by default).
     frameAnimation.start();
}

R.anim.my_animation es solo una lista de animación:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/selected"
android:oneshot="false">
<item
    android:drawable="@drawable/photo_1"
    android:duration="100" />
<item
    android:drawable="@drawable/photo__2"
    android:duration="100" />
    ... and so on...
</animation-list>

preguntado el 16 de mayo de 11 a las 16:05

De acuerdo con la pregunta a la que hizo referencia, la solución se encontraba en el diseño XML. Publique su diseño XML para que podamos verificar que está definiendo los parámetros correctamente. -

@ usuario432209: +1. Me ayudaste a descubrir mi error. Había configurado la altura y el ancho de la vista de la imagen en valores absolutos (ya que muestra algunas cosas además de la animación). Eliminar eso resolvió el problema. ¡Gracias! -

2 Respuestas

En lugar de configurar la animación dibujable en el fondo de la vista de imagen, configúrelo en primer plano usando src y deje que la animación se reproduzca allí. Se cambiará el tamaño de todas las imágenes de la animación del cuadro con la relación de aspecto intacta siempre que establezca un tipo de escala adecuado para la vista de la imagen.

    private void startAnimation(){
    mImageView.setAdjustViewBounds(true);
    mImageView.setScaleType(ScaleType.CENTER);
    mImageView.setImageDrawable(getResources().getDrawable(R.anim.my_animation)); 

    AnimationDrawable frameAnimation = (AnimationDrawable) mImageView.getDrawable();

     // Start the animation (looped playback by default).
     frameAnimation.start();
}

Respondido el 24 de diciembre de 13 a las 22:12

Elegí tu respuesta para resolver mi problema. Tenga en cuenta que solo puede usar mImageView.setImageResource(R.anim.my_animation) para abreviar. - Jeff T.

Esto es un poco complicado pero funciona. Tengo dos imágenes en mi lista de animaciones

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/selected" android:oneshot="false">
    <item android:drawable="@drawable/logo1" android:duration="5000" />
    <item android:drawable="@drawable/logo2" android:duration="300" />
</animation-list>

Luego agregué una tercera imagen (logo0) que es del mismo tamaño que logo1 / 2 pero es completamente transparente. Finalmente utilizo este ImageView:

<ImageView
    android:id="@+id/imageViewLogo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:adjustViewBounds="true"
    android:layout_margin="5dp"
    android:src="@drawable/logo0"
/>

Ahora mi animación conserva la relación de aspecto del logotipo de mis imágenes *.

El código es:

    @Override
    public void onCreate(Bundle savedInstanceState) {
    ...
    imageView = (ImageView) findViewById(R.id.imageViewLogo);
    imageView.setBackgroundResource(R.drawable.logo_animation);
    ...


    public void onWindowFocusChanged (boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
     AnimationDrawable frameAnimation = (AnimationDrawable) imageView.getBackground();
     if(hasFocus) { frameAnimation.start(); } else { frameAnimation.stop(); }
    }

Es muy simple y solo le cuesta unas imágenes ficticias adicionales para sus recursos: sin código adicional, sin cálculos complejos.

respondido 12 mar '13, 02:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.