機(jī)票直達(dá)
Android CameraX 詳解一 (引言&基礎(chǔ))
Android CameraX 詳解二 (實(shí)時(shí)預(yù)覽)
Android CameraX 詳解三 (拍照)
Android CameraX 詳解四 (圖片分析)
Android CameraX 詳解五(視頻拍攝錄制)
實(shí)時(shí)預(yù)覽
在向應(yīng)用添加預(yù)覽時(shí),請(qǐng)使用PreviewView這是一種可以剪裁、縮放和旋轉(zhuǎn)以確保正確顯示的 View。
當(dāng)相機(jī)處于活動(dòng)狀態(tài)時(shí),圖片預(yù)覽會(huì)流式傳輸?shù)?PreviewView 中的 Surface
使用PreviewView
如需使用 PreviewView 實(shí)現(xiàn) CameraX 預(yù)覽,請(qǐng)按以下步驟操作
- 申請(qǐng)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時(shí),請(qǐng)檢查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()會(huì)返回一個(gè)Camera對(duì)象,可以控制相機(jī)輸出(如變焦和曝光),完成以上步驟,即可實(shí)現(xiàn)相機(jī)預(yù)覽
PreviewView的渲染模式
PreviewView 可以使用以下模式之一將預(yù)覽流渲染到目標(biāo) View 上:
PERFORMANCE是默認(rèn)模式。PreviewView會(huì)使用SurfaceView顯示視頻串流,但在某些情況下會(huì)回退為使用TextureView。SurfaceView具有專用的繪圖界面,該對(duì)象更有可能通過內(nèi)部硬件合成器實(shí)現(xiàn)硬件疊加層,尤其是當(dāng)預(yù)覽視頻上面沒有其他界面元素(如按鈕)時(shí)。通過使用硬件疊加層進(jìn)行渲染,視頻幀會(huì)避開 GPU 路徑,從而能降低平臺(tái)功耗并縮短延遲時(shí)間。COMPATIBLE模式。在此模式下,PreviewView會(huì)使用TextureView;不同于SurfaceView,該對(duì)象沒有專用的繪圖表面。因此,視頻要通過混合渲染,才能顯示。在這個(gè)額外的步驟中,應(yīng)用可以執(zhí)行額外的處理工作,例如不受限制地縮放和旋轉(zhuǎn)視頻。
您可以使用 PreviewView.setImplementationMode()選擇適合具體應(yīng)用的實(shí)現(xiàn)模式。如果默認(rèn)的 PERFORMANCE 模式不適合您的應(yīng)用,請(qǐng)參閱以下代碼示例,了解如何設(shè)置 COMPATIBLE 模式:
// previewView is a PreviewView instance
previewView.implementationMode = PreviewView.ImplementationMode.COMPATIBLE
PreviewView的縮放模式
當(dāng)預(yù)覽視頻分辨率與目標(biāo) PreviewView 的尺寸不同時(shí),視頻內(nèi)容需要通過剪裁操作或添加遮幅式黑邊來適應(yīng)視圖(保持原始寬高比)。為此,PreviewView 提供了以下 ScaleTypes:
FIT_CENTER、FIT_START和FIT_END,用于添加遮幅式黑邊。整個(gè)視頻內(nèi)容會(huì)調(diào)整(放大或縮小)為可在目標(biāo)PreviewView中顯示的最大尺寸。不過,雖然整個(gè)視頻幀會(huì)完整顯示,但屏幕畫面中可能會(huì)出現(xiàn)空白部分。視頻幀會(huì)與目標(biāo)視圖的中心、起始或結(jié)束位置對(duì)齊,具體取決于您在上述三種縮放類型中選擇了哪一種。FILL_CENTER、FILL_START和FILL_END,用于進(jìn)行剪裁。如果視頻的寬高比與PreviewView不匹配,畫面中只會(huì)顯示部分內(nèi)容,但視頻仍會(huì)填滿整個(gè)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