Состояния кнопок с фоном как AnimationDrawable в Android - PullRequest
8 голосов
/ 14 марта 2011

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

Есть идеи, как это исправить?Спасибо.

Ответы [ 2 ]

17 голосов
/ 14 марта 2011

Вы делаете неправильное приведение - ваш фон для рисования равен StateListDrawable, а не 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();
  }
}
3 голосов
/ 28 сентября 2013

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

Я решил эту проблему, используя 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()        
    }

Надеюсь, это кому-нибудь поможет:)

...