您的位置:首页 > 移动开发 > Android开发

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

2012-03-29 14:44 429 查看
初学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 不可见)

}

好了,这样动画总算是完工了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: