2011-03-14 18 views
7

He hecho botones personalizados en Android por un tiempo. Las cosas eran simples, solo creaban recursos de imágenes para los estados de los botones y hacían un selector para ello. Todo fue suave y agradable. Ahora encontré una nueva situación. He creado una animación dibujable y la configuré como fondo para mi botón.Estados de botón con fondo como animaciónDibujo en Android

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> 
    <item android:drawable="@drawable/frame1" android:duration="600" /> 
    <item android:drawable="@drawable/frame2" android:duration="300" /> 
    <item android:drawable="@drawable/frame3" android:duration="500" /> 
</animation-list> 

Si configuro la animación como fondo del botón, funciona bien. Si trato de hacer un selector simple

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item 
     android:state_pressed="false" 
     android:drawable="@drawable/animation" /> 

    <item 
     android:state_pressed="true" 
     android:drawable="@drawable/pressed" /> 
    </selector>  

en estado normal del botón tendría animación como fondo y el estado presionado una imagen estática, las cosas no funcionan bien.

En mi actividad principal, en onWindowFocus consigo el fondo del botón y empezar la animación

@Override 
    public void onWindowFocusChanged(boolean hasFocus) { 
     super.onWindowFocusChanged(hasFocus); 
      btn = (Button)findViewById(R.id.btnAnim); 
      btnAnimation = (AnimationDrawable) btnAnim.getBackground(); 
      btnAnimation.start(); 
} 

Aquí parece ser el problema, porque mi animación no se toma correctamente desde el selector y consigo el siguiente error:

03-14 15:21:16.146: ERROR/AndroidRuntime(440): FATAL EXCEPTION: main 
03-14 15:21:16.146: ERROR/AndroidRuntime(440): java.lang.ClassCastException: android.graphics.drawable.StateListDrawable 
03-14 15:21:16.146: ERROR/AndroidRuntime(440):  at com.bebenjoy.MainActivity.onWindowFocusChanged(MainActivity.java:53) 
03-14 15:21:16.146: ERROR/AndroidRuntime(440):  at ... 

¿Alguna idea de cómo solucionar esto? Gracias.

+0

puede u PLZ proporcionan código completo de la actividad principal –

Respuesta

17

Estás haciendo un lanzamiento incorrecto - tu fondo dibujable es StateListDrawable, no AnimationDrawable. Prefiero hacer algo como:

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    btn = (Button)findViewById(R.id.btnAnim); 
    StateListDrawable background = (StateListDrawable) btn.getBackground(); 
    Drawable current = background.getCurrent(); 
    if (current instanceof AnimationDrawable) { 
     btnAnimation = (AnimationDrawable) current; 
     btnAnimation.start(); 
    } 
} 
+1

Usted ha hecho mi día. Muchas gracias por su ayuda. – Alin

+1

De nada :) –

3

Mi respuesta es un poco tarde, lo sé, pero me enfrenté al mismo problema. Revisé muchas soluciones, pero encontré solo una. He intentado iniciar la animación en onWindowFocusChanged(), inicie la animación en un subproceso separado, pero no ayuda.

He resuelto este problema utilizando setVisible (boolean visible, boolean restart)

Así que usted puede probar esto:

private Button ImgBtn; 
    private AnimationDrawable btnAnimation; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     btn = (Button)findViewById(R.id.button1); 
     StateListDrawable background = (StateListDrawable) btn.getBackground(); 
     btnAnimation = (AnimationDrawable) background.getCurrent(); 
     btnAnimation.setVisible(true, true); // it works even in onCreate()   
    } 

Esperamos que esto ayude a alguien :)

+0

La única respuesta que me funcionó también. Muchas gracias. – Zoleas

Cuestiones relacionadas