android image设置adjustviewbounds_探索 Android 平台的 CameraX
前言
如果你曾經用過 Android 的 Camera APIs,你可能已經感受到了,它們一直沒有成為最容易實現的東西。最開始是 Camera API,然后又推薦使用 Camera2 API — 這個升級是為了讓開發者在使用 Android 的相機 API 時有更好的體驗。然而,使用相機的 API (即使是最簡單的使用)時還是會有很多臟代碼,而且,在 Android 應用中要實現 Camera 功能時還是會很困難。
幸運的是,新的 CameraX API 給相機功能開發提供了更簡單的解決方案以幫助我們減輕這些痛苦。另外,CameraX 基于 Camera2 API 實現,它極大地簡化了在 minSdk 21 及以上版本的實現過程。這篇文章將會研究 CameraX API 的第一部分,了解 Camera API 是什么以及我們如何在 App 中開始使用它。
第一次看我文章的小伙伴可以關注一下我,順便關注一下我的專欄:Android進階,每天更新各種技術干貨,希望更多人能加入進來,一起學習交流,走在技術前面。
Android進階?zhuanlan.zhihu.com配置 CameraX
CameraX 由兩個概念來完成實現 -- Camera View 和 Camera Core。Camera View 可被單獨用于處理基本的相機要求,比如拍照,錄視頻,生命周期管理以及相機切換等。而核心庫能夠搭配 Camera View 處理更復雜的 CameraX 實現(比如在當前的相機上下文提供一個取景器)。我們將會在這篇文章中看看 CameraView 組件是怎么工作的。
開始使用 CameraX 之前,我們需要一些配置步驟。放心,從添加權限到在你的 app 里有一個簡單的 camera 實現,不會有很多步驟(甚至也不會有很多代碼)。
首先在應用的 manifest 添加 Camera 權限:
<uses-permission android:name="android.permission.CAMERA" />然后,需要添加必要的依賴:
def camerax_version = "1.0.0-alpha01" // 添加 CameraX core “androidx.camera:camera-core:${camerax_version}” // 添加 CameraX Camera2 API 互操作支持 implementation “androidx.camera:camera-camera2:${camerax_version}”注意:CamaraView 現在還不可用,但你可以在這里看源碼。因為這個原因,實現的細節未來可能會有變化。
你可能注意到了,這里有兩個不同的依賴:
- Camera Core 庫為使用 CameraX 庫提供了必要的類
- CameraX Camera2 依賴提供了一些互操作功能所以我們能夠在 CameraX 中集成一些已有的 Camera2 實現。
有了上面的準備工作,我們現在可以看看如何在我們的應用里實現 Camera view 組件了。
Camera View
正如上文所說,CameraView 給開發者提供了方法,使他們不需要太多困難就可以在 app 里提供基礎的 camear 實現。我們能夠在布局文件里直接添加這個組件:
<androidx.camera.view.CameraViewandroid:id="@+id/view_camera"android:layout_width="match_parent"android:layout_height="match_parent" />這個 CameraView 類是一個 ViewGroup,本質上包含了一個 TextureView 來顯示 camera 流,以及配置這個組件的一些屬性。
- scaleType—給捕獲的流設置縮放類型。可以使 CENTER_CROP 或者 CENTER_INSIDE
- quality—設置捕獲的媒體的質量。可以是 MAX,HIGH,MEDIUM 或者 LOW
- pinchToZoomEnabled—一個布爾值,控制用戶是否能夠在 CameraView 內使用手指縮放視圖
- captureMode—設置捕獲模式。可以是 IMAGE,VIDEO 或者 FIXED
- lensFacing—設置鏡頭。可以是 FRONT,BACK 或者 NONE
- flashMode—設置閃光燈模式。可以是 FRONT,BACK 或者 NONE
這些 xml 屬性既可以在布局文件里設置,也可以在代碼里設置。所以,如果你想提供 UI 控件控制上面這些屬性 ,你可以使用 ClickListener 來設置這些屬性。
既然我們是在 Activity 里布局的 CameraView,我們可以用 CameraView 的 bindToLifeCycle 方法將這個 View 與當前組件的生命周期綁定。
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { ...view_camera.bindToLifecycle(this) } }前面所說的已經配置并且添加到我們的工程了,現在我們在 app 里有了一個準備好了的簡單的 CameraView 來捕獲媒體。需要說明的是,CameraView 不能被單獨擴展來提供更多的功能。CameraView 的目標是提供一個簡化的可以方便地以 View 的形式使用的相機實現。如果你想要實現更多的功能,你需要使用 CameraX Core 庫,我們將在另一篇文章里聊到它。
如果你已經完成了上面的配置,那你應該能夠打開相機并且在屏幕上看到預覽了。CameraView 提供了一些當用戶操作 UI 時我們可以觸發的方法。
- toggleCamera—切換設備正在使用的相機(例如在前置和后置相機之間切換)
- enableTorch—開啟閃光燈
- setCameraByLensFacing—設置相機使用面向某個方向的鏡頭。可以是 LensFacing.Back 或者 LensFacing.Front。
- hasCameraWithLensFacing—檢測相機是否有與 LensFaing 值對應的鏡頭
- focus—相機在指定矩形范圍內對焦
當要使用拍照功能時,takePicture 方法可以從相機捕獲圖片。這里我們需要提供一個圖片數據保存位置的文件引用,以及一個在圖片成功保存或者出現錯誤時使用的 Listener。
camera_view.takePicture(File("some_file_path"),object : ImageCaptureUseCase.OnImageSavedListener {override fun onImageSaved(file: File) {// 處理被保存的圖片}override fun onError(error: ImageCaptureUseCase.UseCaseError,message: String,throwable: Throwable?) {// 處理錯誤}})當拍攝視頻出現錯誤是,ImageCaptureUseCase.UseCaseError 將會給我們返回以下的某一錯誤狀態:
- UNKNOWN_ERROR
- FILE_IO_ERROR
takePicture 還有另一種形式,這種形式只使用一個 OnImageCaptureListener 回調參數。這個回調用來監聽圖片被捕捉(或者出現了錯誤),然后開發者可以根據情況處理結果數據。前面的 takePicture 使用更簡單,但這個 takePicture 提供了更多的靈活性。
camera_view.takePicture(object : ImageCaptureUseCase.OnImageCapturedListener() {override fun onCaptureSuccess(image: ImageProxy, rotationDegrees: Int) {// 處理捕捉的圖片}override fun onError(useCaseError: ImageCaptureUseCase.UseCaseError?, message: String?, cause: Throwable?) {// 處理圖片捕獲錯誤}})我們可能也想使用 CameraView 來錄視頻。這時候我們需要使用 startRecoring() 方法—只需要傳遞一個用來保存結果的文件引用,以及一個 來處理操作結果(成果或者失敗)的 listener
camera_view.startRecording(File("some_file_path"),object : VideoCaptureUseCase.OnVideoSavedListener {override fun onVideoSaved(file: File?) {// Handle video saved}override fun onError(error: VideoCaptureUseCase.UseCaseError?, message: String?, throwable: Throwable?) {// Handle video error}})這里你可以看到,onVideSaved 方法給我們返回一個被保存的視頻數據的文件實例。我們也有 onError 方法用來處理錯誤狀態,在我們的 UI 上根據情況 作出對應的反饋。當拍攝視頻導致錯誤時,VideoCaptureUseCase.UseCaseError 將會返回下面錯誤狀態中的某一個:
- UKNOWN_ERROR
- ENCODER_ERROR
- MUXER_ERROR
- RECORDING_IN_PROGRESS
當用戶希望停止拍攝視頻時,我們只需要調用 stopRecording 方法讓用例 知道我們希望停止拍攝視頻:
camera_view.stopRecording()最后,當我們使用 CameraView 完畢后,我們必須確保解綁相機,釋放被用到的資源:
override fun onDestroyView() {super.onDestroyView()CameraX.unbindAll() }這篇文章我們了解了 CameraX 庫以及 CameraView,學習如何使用以及使用它能夠做什么。在安卓程序中實現相機功能,尤其是不需要使用高級的功能,這是一個很大的進步。你將會使用 CameraView 嗎?如果你有任何想分享的想法或者問題,請一定要分享出來!
總結
以上是生活随笔為你收集整理的android image设置adjustviewbounds_探索 Android 平台的 CameraX的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 后端:循环遍历的用法介绍
- 下一篇: 数据库技术基础:数据库管理系统的功能介绍