1

Я хочу добавить анимационный список в XML-файл selectors, который, в свою очередь, добавляется в ImageButton. В состоянии по умолчанию, я хочу, чтобы анимация была воспроизведена и в нажатом состоянии, я хочу отобразить другое изображение. Мой код работает на изменения состояния кнопки, но анимация не работает в состоянии по умолчанию. На самом деле я читаю AndroidКак добавить анимацию кадра в ImageButton, включая обработку изменения состояния кнопки?

anim_virus.xml:

<?xml version="1.0" encoding="utf-8"?> 
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" 
android:oneshot="false"> 
    <item android:drawable="@drawable/attackvirus0" android:duration="50" /> 
    <item android:drawable="@drawable/attackvirus1" android:duration="50" /> 
    <item android:drawable="@drawable/attackvirus2" android:duration="50" /> 
    <item android:drawable="@drawable/attackvirus3" android:duration="50" /> 
    <item android:drawable="@drawable/attackvirus4" android:duration="50" /> 
    <item android:drawable="@drawable/attackvirus5" android:duration="50" /> 
    <item android:drawable="@drawable/attackvirus4" android:duration="50" /> 
    <item android:drawable="@drawable/attackvirus3" android:duration="50" /> 
    <item android:drawable="@drawable/attackvirus2" android:duration="50" /> 
    <item android:drawable="@drawable/attackvirus1" android:duration="50" /> 
</animation-list> 

button_state_virus.xml:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" android:drawable="@drawable/attackviruspress"/> 
    <item android:state_focused="true" android:drawable="@drawable/attackvirusfocus"/> 
    <item android:drawable="@drawable/anim_virus" android:state_enabled="true"/> 
</selector> 

И моя кнопка тег изображения и его параметры:

<ImageButton 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="#00000000" 
     android:layout_margin="10dp" 
     android:soundEffectsEnabled="true" 
     android:src="@drawable/button_state_virus" 
     android:id="@+id/button_infect" 
     android:contentDescription="@string/content_desc_virus"/> 

ответ

0

Для просто drawable фона анимации вы можете сделать:

ImageButton imageButton = (ImageButton) findViewById(R.id.button_infect); 
imageButton.setBackgroundResource(R.drawable.anim_virus); 

если вы хотите .start() анимацию, сделать это:

((AnimationDrawable) imageButton.getBackground()).start(); 

если вы хотите .stop() это, сделать это:

((AnimationDrawable) imageButton.getBackground()).stop(); 

Но, чтобы получить анимацию StateListDrawable от вашего ImageButton, вы установили StateListDrawable как ваш атрибут android:background в XML.

StateListDrawable background = (StateListDrawable) imageButton.getBackground(); 
Drawable current = background.getCurrent(); 

if (current instanceof AnimationDrawable) { 
    imageButton = (AnimationDrawable) current; 
    btnAnimation.start(); 
} 

Так что этот код получает фон от ImageButton, он затем определяет фон как drawable в зависимости от состояния вы находитесь. Если текущее состояние является instanceof AnimationDrawable то есть ваши animation-list тогда он будет играть анимация.

Редактировать: изменено с ошибки в комментариях

Е/AndroidRuntime: неустранимый: Основной процесс: java.lang.RuntimeException: Невозможно запустить активность ComponentInfo {AttackPlanetActivity}: java.lang.ClassCastException: android.graphics.drawable.StateListDrawable не может быть приведен к android.graphics.drawable.AnimationDrawable в android.app.ActivityThread.performLaunchActivity

Кредит для редактирования: Button states with Background as AnimationDrawable in Android

+0

Я попытался использовать AnimationDrawable, как вы уже упоминали. Но это приводит к сбою приложения с описанием ошибки «E/AndroidRuntime: FATAL EXCEPTION: main Process: java.lang.RuntimeException: не удается запустить Activity ComponentInfo {AttackPlanetActivity}: java.lang.ClassCastException: android.graphics.drawable.StateListDrawable не может быть отброшен в android.graphics.drawable.AnimationDrawable на android.app.ActivityThread.performLaunchActivity '. Если я установил anim_virus на кнопку и удалил параметр android: src, я смогу увидеть анимацию с AnimationDrawable start() –

+0

, чтобы проверить новый почтовый редактор. –