Intereting Posts
Использование плагина Hugo AppCompat v7: 21 Разбитая панель действий Разбита? Невозможно увидеть облачную опцию в Developer Services для Android Studio 2.2 Область Warp Image при касании точки? JSONParser не может быть разрешен к типу SLF4J varargs интерпретирует первую строку как маркер Сбой приложений для Android при запуске: SQLite NullPointerException в ContactsFragment GetSupportActionBar (панель инструментов) выбрасывает исключение нулевого указателя, используя Butterknife для панели инструментов Как я могу добавить OnClickListener в Drawable в EditText? Android-приложение для выставления счетов Проверка получения в Dot Net (C #) Почему я должен использовать Spring Android? AlarmManager не работает, как ожидалось, в режиме ожидания на S5 Neo Android WebView неправильно обрабатывает символы новой строки в предварительно отформатированном тексте Ошибка устройства – s3dReadConfigFile «Невозможно открыть файл для чтения». UnsupportedOperationException в GLES20Canvas.clipPath с отключением аппаратного ускорения

Кнопка состояния с фоном как 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() } 

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