2011-05-16 18 views
8

La animación que estoy ejecutando dentro de una vista de imagen se niega a mantener la relación de aspecto de los marcos de imagen. Las siguientes respuestas en SO son bastante informativo, pero no parecen funcionar para mí: How to scale an Image in ImageView to keep the aspect ratioAndroid: Cómo mantener la relación de aspecto en animación

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 sólo 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> 
+1

Según la pregunta que mencionó, la solución mintió en el diseño XML. Publique su diseño XML para que podamos verificar que está definiendo los parámetros correctamente. – user432209

+0

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

Respuesta

0

Esto es un poco complicado pero funciona. que tienen dos imágenes en mi 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/logo1" android:duration="5000" /> 
    <item android:drawable="@drawable/logo2" android:duration="300" /> 
</animation-list> 

Luego añadió una tercera imagen (logo0) que es del mismo tamaño de logo1/2 pero es totalmente transparente. Finalmente Yo uso 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 de mi insignia de los cuadros *.

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 sólo cuesta un extra de imágenes ficticias para usted los recursos: ningún código adicional, no hay cálculos complejos.

10

En lugar de establecer la animación que se puede dibujar en el fondo de la vista de imagen, configúrela en primer plano con src y deje que la animación se reproduzca allí. Todas las imágenes en la animación de marco se redimensionarán con la relación de aspecto intacta siempre que establezca un tipo de escala adecuado para la vista de 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(); 
} 
+0

Volví a subir tu respuesta para resolver mi problema. Tenga en cuenta que solo puede usar 'mImageView.setImageResource (R.anim.my_animation)' para abreviar. –

+0

gracias, me salvaste el día :) – iscariot

Cuestiones relacionadas