機(jī)票直達(dá)
Android CameraX 詳解一 (引言&基礎(chǔ))
Android CameraX 詳解二 (實時預(yù)覽)
Android CameraX 詳解三 (拍照)
Android CameraX 詳解四 (圖片分析)
Android CameraX 詳解五(視頻拍攝錄制)
實時預(yù)覽
在向應(yīng)用添加預(yù)覽時膘盖,請使用PreviewView
這是一種可以剪裁颤霎、縮放和旋轉(zhuǎn)以確保正確顯示的 View
。
當(dāng)相機(jī)處于活動狀態(tài)時笛洛,圖片預(yù)覽會流式傳輸?shù)?PreviewView
中的 Surface
使用PreviewView
如需使用 PreviewView
實現(xiàn) CameraX 預(yù)覽濒蒋,請按以下步驟操作
- 申請camera權(quán)限
- 將
PreviewView
添加到布局
<FrameLayout
android:id="@+id/container">
<androidx.camera.view.PreviewView
android:id="@+id/previewView" />
</FrameLayout>
- 創(chuàng)建
ProcessCameraProvider
import androidx.camera.lifecycle.ProcessCameraProvider
import com.google.common.util.concurrent.ListenableFuture
class MainActivity : AppCompatActivity() {
private lateinit var cameraProviderFuture : ListenableFuture<ProcessCameraProvider>
override fun onCreate(savedInstanceState: Bundle?) {
cameraProviderFuture = ProcessCameraProvider.getInstance(this)
}
}
- 在創(chuàng)建
View
時裆馒,請檢查ProcessCameraProvider
cameraProviderFuture.addListener(Runnable {
val cameraProvider = cameraProviderFuture.get()
bindPreview(cameraProvider)
}, ContextCompat.getMainExecutor(this))
- 選擇相機(jī)并綁定生命周期和用例
fun bindPreview(cameraProvider : ProcessCameraProvider) {
val preview = Preview.Builder() .build()
val cameraSelector = CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build()
preview.setSurfaceProvider(previewView.getSurfaceProvider())
cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview)
}
-
bindToLifecycle()
會返回一個Camera
對象霜第,可以控制相機(jī)輸出(如變焦和曝光)蹦掐,完成以上步驟技羔,即可實現(xiàn)相機(jī)預(yù)覽
PreviewView的渲染模式
PreviewView
可以使用以下模式之一將預(yù)覽流渲染到目標(biāo) View
上:
PERFORMANCE
是默認(rèn)模式。PreviewView
會使用SurfaceView
顯示視頻串流笤闯,但在某些情況下會回退為使用TextureView
堕阔。SurfaceView
具有專用的繪圖界面,該對象更有可能通過內(nèi)部硬件合成器實現(xiàn)硬件疊加層颗味,尤其是當(dāng)預(yù)覽視頻上面沒有其他界面元素(如按鈕)時超陆。通過使用硬件疊加層進(jìn)行渲染,視頻幀會避開 GPU 路徑浦马,從而能降低平臺功耗并縮短延遲時間时呀。COMPATIBLE
模式。在此模式下晶默,PreviewView
會使用TextureView
谨娜;不同于SurfaceView
,該對象沒有專用的繪圖表面磺陡。因此趴梢,視頻要通過混合渲染,才能顯示币他。在這個額外的步驟中坞靶,應(yīng)用可以執(zhí)行額外的處理工作,例如不受限制地縮放和旋轉(zhuǎn)視頻蝴悉。
您可以使用 PreviewView.setImplementationMode()
選擇適合具體應(yīng)用的實現(xiàn)模式彰阴。如果默認(rèn)的 PERFORMANCE
模式不適合您的應(yīng)用,請參閱以下代碼示例拍冠,了解如何設(shè)置 COMPATIBLE
模式:
// previewView is a PreviewView instance
previewView.implementationMode = PreviewView.ImplementationMode.COMPATIBLE
PreviewView的縮放模式
當(dāng)預(yù)覽視頻分辨率與目標(biāo) PreviewView
的尺寸不同時尿这,視頻內(nèi)容需要通過剪裁操作或添加遮幅式黑邊來適應(yīng)視圖(保持原始寬高比)簇抵。為此,PreviewView
提供了以下 ScaleTypes
:
FIT_CENTER
射众、FIT_START
和FIT_END
碟摆,用于添加遮幅式黑邊。整個視頻內(nèi)容會調(diào)整(放大或縮性鹎颉)為可在目標(biāo)PreviewView
中顯示的最大尺寸焦履。不過,雖然整個視頻幀會完整顯示雏逾,但屏幕畫面中可能會出現(xiàn)空白部分嘉裤。視頻幀會與目標(biāo)視圖的中心、起始或結(jié)束位置對齊栖博,具體取決于您在上述三種縮放類型中選擇了哪一種屑宠。FILL_CENTER
、FILL_START
和FILL_END
仇让,用于進(jìn)行剪裁典奉。如果視頻的寬高比與PreviewView
不匹配,畫面中只會顯示部分內(nèi)容丧叽,但視頻仍會填滿整個PreviewView
卫玖。
CameraX 使用的默認(rèn)縮放類型是 FILL_CENTER
。您可以使用 PreviewView.setScaleType()
設(shè)置最適合具體應(yīng)用的縮放類型踊淳。下面的代碼示例設(shè)置了 FIT_CENTER
縮放類型:
// previewView is a PreviewView instance
previewView.scaleType = PreviewView.ScaleType.FIT_CENTER