我已经在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 ...
有关如何解决此问题的任何想法?感谢。
答案 0 :(得分: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 :(得分: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()
}
希望这会对某人有所帮助:)。