Кнопка состояния с фоном как AnimationDrawable в Android

Я создал пользовательские кнопки в 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> 

Если я задаю анимацию как фоновый фон, она отлично работает. Если я попытаюсь сделать простой селектор

 <?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> 

Где нормальное состояние кнопки будет иметь анимацию в качестве фона, а нажатие – статическое изображение, все работает неправильно.

В моей основной деятельности, на onWindowFocus я получаю фон кнопки и начинаю анимацию

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

Здесь, похоже, проблема, потому что моя анимация не будет корректно выбрана из селектора, и я получаю следующую ошибку:

 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 ... 

Любая идея о том, как это исправить? Благодарю.

Solutions Collecting From Web of "Кнопка состояния с фоном как AnimationDrawable в Android"

Вы делаете неправильный StateListDrawable – ваш фоновый StateListDrawableStateListDrawable , а не AnimationDrawable . Я бы предпочел сделать что-то вроде:

 @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(); } } 

Мой ответ немного запоздал, я знаю, но я столкнулся с той же проблемой. Я проверил множество решений, но нашел только один. Я попытался запустить анимацию в onWindowFocusChanged (), запустить анимацию в aseparate thread, но это не поможет.

Я решил эту проблему, используя setVisible (boolean visible, boolean restart)

Поэтому вы можете попробовать следующее:

  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() } 

Надеюсь, это поможет кому-то 🙂