Android 学习笔记(camera)——每天进步一点点

初学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 不可见)
}


好了,这样动画总算是完工了!




猜你喜欢

转载自blog.csdn.net/xqt8888/article/details/7372002