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 不可见)
}
好了,这样动画总算是完工了!
我的代码是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 不可见)
}
好了,这样动画总算是完工了!
相关文章推荐
- 每天进步一点点:(5)vi/vim 学习笔记
- 每天进步一点点之Android学习札记1
- 每天一点点:android的选项菜单和其子菜单学习笔记
- 每天进步一点点:(21)SAMBA笔记
- 每天进步一点点##为什么是“51-android.rules”?
- 学习记录,每天进步一点点
- 安卓学习笔记---android Opencv修改Camera 输出分辨率
- android:每天进步一点点
- JAVA 学习日志 测试抽象类的程序,每天进步/退步一点点,变化很大哦,努力!
- 《(学习笔记)两天进步一点点》——ListView AND TreeVie
- 每天进步一点点:(11)进程优先级学习 nice
- 每天进步一点点——记学struts+spring+hibernate的感想,献给所有正在学习软件开发的朋友们
- 每天进步一点点-----学习JS的第一个小游戏
- 《(学习笔记)两天进步一点点》(5)——几个比较小的类,但很实用
- 《(学习笔记)两天进步一点点》(3)——应用BindingSource实现数据同步
- 每天进步一点点——我的leetcode刷题笔记
- 每天学习一点点,每天进步一点点、、、、、
- 不断学习,每天进步一点点【图像,计算机视觉,机器学习,学习积累】
- 2011年Android Camera学习笔记之一
- 每天一点点—Opengl学习笔记。