2011-03-14 6 views
7

しばらくAndroidでカスタムボタンを作成しました。物事はシンプルで、ちょうどボタン状態のためのイメージリソースを作り、そのセレクタを作った。すべてがスムーズで素敵でした。今私は新しい状況に遭遇しました。 私はアニメーションのドロウアブルを作成し、それをボタンの背景として設定しました。AndroidでAnimationDrawableとしての背景のボタン状態

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

を作成しようとすると、物事は正しい動作しません。

私のアニメーションがセレクタから正しく取られることはありませんので、私は、ボタンの背景を取得し、

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

が問題のように見えるアニメーションを開始onWindowFocusに私のメインの活動に

、と私は取得次のエラーが発生しました:

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

これを修正する方法はありますか?ありがとう。

+0

uはあなたが作った –

答えて

17

あなたは間違ったキャストを行っています - あなたの背景のドロウアブルはではなく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(); 
    } 
} 
+1

の主な活動のための完全なコードを提供plzはでき助けます私の一日。ご助力ありがとうございます。 – Alin

+1

あなたも大歓迎です:) –

3

私の答えは少し遅いですが、私は同じ問題に直面しました。私は多くのソリューションをチェックしましたが、1つしか見つかりませんでした。 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()   
    } 

・ホープこれは誰か:)

+0

私にとっては唯一の答えです。どうもありがとう。 – Zoleas

関連する問題