现在的位置: 首页 > 综合 > 正文

AnimationDrawable在2.2系统上开始动画后无法显示的问题

2018年04月27日 ⁄ 综合 ⁄ 共 1438字 ⁄ 字号 评论关闭

今天在尝试使用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发延迟消息来开启,或者如果可以的话,用界面事件驱动吧。

希望对大家有帮助

抱歉!评论已关闭.