今天在尝试使用AnimationDrawable进行Frame Animation的效果时,发现了一个问题。
先看实际代码
@Override
public void onWindowFocusChanged(boolean hasFocus) {//注3
mAnim = InitFrame();
// iv_BreathingMic.setBackgroundDrawable(mAnim);//注1
// ((AnimationDrawable)iv_BreathingMic.getBackground()).start();
//2.2系统上以下方法Drawable的元素不会出现
iv_BreathingMic.setImageDrawable(mAnim);//注2
((AnimationDrawable)iv_BreathingMic.getDrawable()).start();
super.onWindowFocusChanged(hasFocus);
}
private AnimationDrawable InitFrame(){
AnimationDrawable frame = new AnimationDrawable();
for(int i = 0; i < FRAME_COUNT; i++) {
String name = String.format("breathing_mic_%05d", i);
int id = getResources().getIdentifier(name, "drawable", getPackageName());
Drawable drawable = getResources().getDrawable(id);
frame.addFrame(drawable, T);
}
for(int i = FRAME_COUNT - 2; i > 0; i--) {
String name = String.format("breathing_mic_%05d", i);
int id = getResources().getIdentifier(name, "drawable", getPackageName());
Drawable drawable = getResources().getDrawable(id);
frame.addFrame(drawable, T);
}
frame.setOneShot(false);
return frame;
}
这个问题出自于注1和注2两个实现方法,如果当我使用注2的方法展示AnimationDrawable时在我的一个2.2系统的手机上无法显示这个ImageView元素。而如果使用注1的方法,在2.2和4.0的手机上都能显示。
问题原因:因为注2的方法没有设置ImageView的背景,而我的ImageView的layoutParams设置的宽高都是wrap_centent所以导致无法显示。如果我使用注2 的方法,并且设置一张图片作为ImageView的setBackgroundDrawable那么就能显示了,并且ImageView的大小又background的大小来决定。这一点应该是不同版本的系统的内部实现不同导致的(比如说可能4.0系统上ImageView有一个默认的background)。
建议:如注3所示,建议大家不要在oncreate中开始AnimationDrawable。需要在更后面的生命周期调用,或者用handle发延迟消息来开启,或者如果可以的话,用界面事件驱动吧。
希望对大家有帮助