【Android Camera】 之 SmoothZoom

來源:互聯網
上載者:User

       最近忙於項目中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倍的效果……

 

 

 

 

 

更為可怕的是,當自動化的測試zoom N個來回後,重複啟動camera,滿屏的I2C ERROR 告訴我camera掛掉了……如果找不出問題所在,我也要掛掉了……

 

   Camera部分檔案量較大,同名也多,不得不先做個梳理,理清思路。

 

 

 

 

 

Camera.cpp的路徑我沒有寫,是有原因的。

對於上層應用來說,camera.cpp是最為直接的函數調用和實現,可以參考閱讀framework/base/libs/camera/Camera.cpp ,但是在硬體裝置確定的情況下,是根據硬體的功能具體實現整合到實際項目中的某一路徑的,習慣上來講放在hardware/下,至於怎麼編譯進來那是另外一方面的內容了。

 

啟動camera,首先對zoom進行初始化,如果硬體不支援zoom,那麼直接return了。

支援,使mSmoothZoomSupported置為true。

  private void initializeZoom() { </p><p> if (!mParameters.isZoomSupported()) return; </p><p> // Maximum zoom value may change after preview size is set. Get the </p><p> // latest parameters here. </p><p> mParameters = mCameraDevice.getParameters(); </p><p> mZoomMax = mParameters.getMaxZoom(); </p><p> mSmoothZoomSupported = mParameters.isSmoothZoomSupported(); </p><p> mGestureDetector = new GestureDetector(this, new ZoomGestureListener()); </p><p> mCameraDevice.setZoomChangeListener(mZoomListener); </p><p> }<br />  對zoom狀態的監聽由class ZoomListener

  implements android.hardware.Camera.OnZoomChangeListener {
包辦,不同的zoom狀態標緻也是傳值給底層如何進行下一步的標緻 private void onZoomValueChanged(int index) { </p><p> if (mSmoothZoomSupported) { </p><p> if (mTargetZoomValue != index && mZoomState != ZOOM_STOPPED) { </p><p> mTargetZoomValue = index; </p><p> if (mZoomState == ZOOM_START) { </p><p> mZoomState = ZOOM_STOPPING; </p><p> mCameraDevice.stopSmoothZoom(); </p><p> } </p><p> } else if (mZoomState == ZOOM_STOPPED && mZoomValue != index) { </p><p> mTargetZoomValue = index; </p><p> mCameraDevice.startSmoothZoom(index); </p><p> mZoomState = ZOOM_START; </p><p> } </p><p> } else { </p><p> mZoomValue = index; </p><p> setCameraParametersWhenIdle(UPDATE_PARAM_ZOOM); </p><p> } </p><p> } </p><p>

 

 

 當接到zoom改變訊號的時候

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

 

 

其實拋開I2C的問題,僅僅明確這幾個操作就足以解決問題。今天實在太累了,下回接著寫好了 —_—||

歡迎驅動牛人多多交流camera I2C 方面的經驗。

 

 

作者:yiyaaixuexi 發表於2011-5-21 17:04:00 原文連結 閱讀:507 評論:14 查看評論

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.