【Android Camera】 之 SmoothZoom

     头疼  最近忙于项目中Camera的种种,由于大多数热衷于交流的Android开发者是在模拟器上进行开发,在涉及到硬件相关的实践内容上,(例如此刻我将记录的有关于Camera的变焦问题),网上可查询和借鉴的资料真是少的可怜。不过想想也是,项目中具体硬件的相关信息调试过程也不便公之于众。我不写细节,说说思路吧。

 

  


         

        我所遇到的camera的变焦问题是这样的:

 

        zoom value 满足于区间:[0,28],平均对应smooth zoom的效果是放大1倍到8倍。

我将smoothzoom 从*1 拖到 *8 的Log:

 

V/camera  (30714): Zoom changed: value=1. stopped=true
D
/camera  (30714):  ^_^ ZOOM_STOPPING
V
/camera  (30714): Zoom changed: value=2. stopped=true

D
/camera  (30714):  ^_^ ZOOM_STOPPING
V
/camera  (30714): Zoom changed: value=3. stopped=true

D
/camera  (30714):  ^_^ ZOOM_STOPPING
V
/camera  (30714): Zoom changed: value=4. stopped=true

D
/camera  (30714):  ^_^ ZOOM_STOPPING
V
/camera  (30714): Zoom changed: value=5. stopped=true

D
/camera  (30714):  ^_^ ZOOM_STOPPING
V
/camera  (30714): Zoom changed: value=7. stopped=false

D
/camera  (30714):  ^_^ ZOOM_START
V
/camera  (30714): Zoom changed: value=8. stopped=false

D
/camera  (30714):  ^_^ ZOOM_START
V
/camera  (30714): Zoom changed: value=10. stopped=false

D
/camera  (30714):  ^_^ ZOOM_START
V
/camera  (30714): Zoom changed: value=12. stopped=false

D
/camera  (30714):  ^_^ ZOOM_START
V
/camera  (30714): Zoom changed: value=15. stopped=false

D
/camera  (30714):  ^_^ ZOOM_START
V
/camera  (30714): Zoom changed: value=18. stopped=false

D
/camera  (30714):  ^_^ ZOOM_START
V
/camera  (30714): Zoom changed: value=21. stopped=false

D
/camera  (30714):  ^_^ ZOOM_START
V
/camera  (30714): Zoom changed: value=24. stopped=false

D
/camera  (30714):  ^_^ ZOOM_START
V
/camera  (30714): Zoom changed: value=28. stopped=true

D
/camera  (30714):  ^_^ ZOOM_START

(注意:value=28不代表是28倍,而是8倍)

 

 按上面的Log分析看来,逻辑十分错乱,按道理说stopped参数为true时,zoom为停止。value 1-5的true值让我费解。这个在真机上实际效果就是,在取景画面中看到是a倍的场景,但是拍出的照片确实b倍的效果……

555

 

 

 

 

 

更为可怕的是,当自动测试zoom N个来回后,重复启动camera,满屏的I2C ERROR 告诉我camera挂掉了……如果找不出问题所在,我也要挂掉了……


 

   Camera部分文件量较大,同名也多,不得不先做个梳理,理清思路。

 

 

camera

 

 

 

Camera.cpp的路径我没有写,是有原因的。

对于上层应用来说,camera.cpp是最为直接的函数调用和实现,可以参考阅读framework/base/libs/camera/Camera.cpp ,但是在硬件设备确定的情况下,是根据硬件的功能具体实现整合到实际项目中的某一路径的,习惯上来讲放在hardware/下,至于怎么编译进来那是另外一方面的内容了。

 

启动camera,首先对zoom进行初始化,如果硬件不支持zoom,那么直接return了。

支持,使mSmoothZoomSupported置为true。

 
private void initializeZoom() { if (!mParameters.isZoomSupported()) return; // Maximum zoom value may change after preview size is set. Get the // latest parameters here. mParameters = mCameraDevice.getParameters(); mZoomMax = mParameters.getMaxZoom(); mSmoothZoomSupported = mParameters.isSmoothZoomSupported(); mGestureDetector = new GestureDetector(this, new ZoomGestureListener()); mCameraDevice.setZoomChangeListener(mZoomListener); }
 
对zoom状态的监听由class ZoomListener
 implements android.hardware.Camera.OnZoomChangeListener {
包办,不同的zoom状态标致也是传值给底层如何进行下一步的标致
private void onZoomValueChanged(int index) { if (mSmoothZoomSupported) { if (mTargetZoomValue != index && mZoomState != ZOOM_STOPPED) { mTargetZoomValue = index; if (mZoomState == ZOOM_START) { mZoomState = ZOOM_STOPPING; mCameraDevice.stopSmoothZoom(); } } else if (mZoomState == ZOOM_STOPPED && mZoomValue != index) { mTargetZoomValue = index; mCameraDevice.startSmoothZoom(index); mZoomState = ZOOM_START; } } else { mZoomValue = index; setCameraParametersWhenIdle(UPDATE_PARAM_ZOOM); } }

 

 

 当接到zoom改变信号的时候

case CAMERA_MSG_ZOOM: if (mZoomListener != null) { mZoomListener.onZoomChange(msg.arg1, msg.arg2 != 0, mCamera); } return;

 

 

其实抛开I2C的问题,仅仅明确这几个操作就足以解决问题。今天实在太累了,下回接着写好了 —_—||

欢迎驱动牛人多多交流camera I2C 方面的经验。

 

 

作者:yiyaaixuexi 发表于2011-5-21 17:04:00 原文链接
阅读:507 评论:14 查看评论

转载于:https://www.cnblogs.com/jyshi/archive/2011/05/21/2139414.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值