Intereting Posts
Как мне организовать контроль источника для проектов Android, включая библиотеки? Странное растровое изображение с использованием 1 Мб кучи Android – Espresso – прокрутка к списку без списка View item Настройка каталога настраиваемых ресурсов для модульного тестирования в Android Studio Цвет текста всплывающего меню Android (AppCompat) Touch Calculator в Android Android 6.0 – удаляются внешние файлы для хранения при удалении приложения Как загрузить HttpResponse в файл? Не удается установить Android ADT 21.1 на eclipse Juno (Windows 7) после обновления до SDK 21.1 Orm Lite – Не удалось найти публичный конструктор, который имеет один (Контекст) аргумент для вспомогательного класса Получить текущий onClickListener объекта Android View Android переименовать имя устройства для wifi-direct При использовании проекта библиотеки Android, как правильно обращаться к ресурсам xml? Являются ли приложения Android реальными Java-приложениями? В Android, как я могу найти вызывающего метода эффективно

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

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