2011-03-14 98 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>  

在按鈕的正常狀態下將有動畫作爲背景,並按下狀態的靜態圖像,事情不工作的權利。

在我的主要活動,在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 ... 

有關如何解決此問題的任何想法?謝謝。

+0

u能PLZ爲主要活動的完整代碼 – 2011-03-14 13:34:54

回答

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

你已經做了我的一天。非常感謝您的幫助。 – Alin 2011-03-14 17:15:01

+1

不客氣:) – 2011-03-15 00:16:16

3

我的答案有點晚,我知道,但我面臨同樣的問題。我查了很多解決方案,但只找到一個。 我試圖在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 2013-11-13 09:49:33