初学Android ,暂时把我理解的东西记录下来。
我的代码是MTK6573 的 (android 2.3),
目标:在进相机预览的时候加入一个 frame by frame 的动画,类似苹果手机的相机。
要达到我的目标,我觉得我只需要解决这两个问题:
1,在哪里可以导入我的动画?
2,如何导入frame by frame 的动画?
初步设想: 在初始完成之后,调用我的显示动画函数.
暂时把我的动画显示函数贴出来
private void showEnterAnimation()
{
ImageView ani_image =(ImageView)findViewById(R.id.imageview);
anim_1 = (AnimationDrawable)ani_image.getDrawable();
anim_1.start();
}
这个函数实现frame by frame 的动画,(如何停止先不管),需要在 R.layout.camera 的xml文件中 加入 一个imageview 的控件 id = imageview;
另外需要加入一个enter_anim.xml 的文件定义每一帧,并作为这个imageview的src图片。
那么,假设这个函数能正常运行,剩下的就只有找到合适的地方来调用这个函数了。首先想到的是直接放到 onCreate()函数后,结果发现行不通,根本没显示。然后第二次尝试:动态导入view
private void showEnterAnimation()
{
LayoutInflater inflater = getLayoutInflater();
ViewGroup rootView = (ViewGroup) findViewById(R.id.camera);
View ani_view = inflater.inflate( R.layout.camera_first_entry, rootView);//这个layout是自己添加的,里面一个imagview对象
ImageView iv= (ImageView)ani_view.findViewById(R.id.imageview);
anim_1 = (AnimationDrawable)iv.getDrawable();
anim_1.start();
}
这样还是不行,图片不动。
继续研究,跟同事沟通发现原来android的文档上就有说明,这种动画是不能加载到 onCreate()里面的,应该放到onWindowFocusChanged()里,
这样一试,嘿,果然出来效果了。(但在4.0后的版本上放到 oncreate() 里面是可以显示出来的,为什么呢)
效果出来了,继续下一步:能让动画播放完后自动隐藏。
实现这一步,有几个关键的点:
1,如何判断动画是否已经播放完,
2,如何隐藏imageview。
判断动画播放完,有函数 isRunning()这个借口,在动画播放的时候启动一个handler 去调用这个借口,代码如下:
private Handler m_handler = new Handler();
private int frame_count = 0;
private void showEnterAnimation()
{
iv = (ImageView) ani_view.findViewById(R.id.imageview2);
anim_1 = (AnimationDrawable) iv.getDrawable();
anim_1.setOneShot(true);
anim_1.start();
frame_count = anim_1.getNumberOfFrames();
m_handler.post(updateAnimation2);
}
Runnable updateAnimation2 = new Runnable()
{
public void run()
{
if(anim_1.isRunning())
{
Log.d(TAG,"anim_1.isruning....");
m_handler.postDelayed(updateAnimation2, 100);
anim_1.stop();
}
else
{
Log.d(TAG,"anim_1.isruning..end..");
m_handler.removeCallbacks(updateAnimation2);
AnimationFinishCallback();
}
}
};
结果又一个悲剧发生了,anim_1.isRunning() 总是 true, 不知道为什么。我估计这个函数应该是用来判断是不是调用过 start() 函数的,而不能用来判断是否播放完了一次动画。
没办法,只好再加一个变量来,然后根据时间来判断播放了多少帧,修改完就是下面这段代码:
Runnable updateAnimation2 = new Runnable()
{
public void run()
{
if(frame_count > 0)
{
m_handler.postDelayed(updateAnimation2, 100);
frame_count--;
if(frame_count == 0)
anim_finised = true;
}
else
{
m_handler.removeCallbacks(updateAnimation2);
AnimationFinishCallback();
}
}
}
public void AnimationFinishCallback()
{
if(anim_1.isRunning())
anim_1.stop();
iv.setVisibility(View.GONE); // 设置动画的imageview 为不可见
SurfaceView sview = (SurfaceView)findViewById(R.id.camera_preview);
sview.setVisibility(View.VISIBLE);// 把camera_preview 设置为可见(在xml文件中设置其属性为 gone 不可见)
}
好了,这样动画总算是完工了!