Android CameraX 詳解二 (實時預(yù)覽)

機(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_STARTFIT_END碟摆,用于添加遮幅式黑邊。整個視頻內(nèi)容會調(diào)整(放大或縮性鹎颉)為可在目標(biāo) PreviewView 中顯示的最大尺寸焦履。不過,雖然整個視頻幀會完整顯示雏逾,但屏幕畫面中可能會出現(xiàn)空白部分嘉裤。視頻幀會與目標(biāo)視圖的中心、起始或結(jié)束位置對齊栖博,具體取決于您在上述三種縮放類型中選擇了哪一種屑宠。

  • FILL_CENTERFILL_STARTFILL_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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末假瞬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子迂尝,更是在濱河造成了極大的恐慌脱茉,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垄开,死亡現(xiàn)場離奇詭異琴许,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)溉躲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門榜田,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锻梳,你說我怎么就攤上這事箭券。” “怎么了唱蒸?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵邦鲫,是天一觀的道長灸叼。 經(jīng)常有香客問我神汹,道長庆捺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任屁魏,我火速辦了婚禮滔以,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘氓拼。我一直安慰自己你画,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布桃漾。 她就那樣靜靜地躺著坏匪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪撬统。 梳的紋絲不亂的頭發(fā)上适滓,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音恋追,去河邊找鬼凭迹。 笑死,一個胖子當(dāng)著我的面吹牛苦囱,可吹牛的內(nèi)容都是我干的嗅绸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼撕彤,長吁一口氣:“原來是場噩夢啊……” “哼鱼鸠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起喉刘,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤瞧柔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后睦裳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體造锅,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年廉邑,在試婚紗的時候發(fā)現(xiàn)自己被綠了哥蔚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛛蒙,死狀恐怖糙箍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情牵祟,我是刑警寧澤深夯,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響咕晋,放射性物質(zhì)發(fā)生泄漏雹拄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一掌呜、第九天 我趴在偏房一處隱蔽的房頂上張望滓玖。 院中可真熱鬧,春花似錦质蕉、人聲如沸势篡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽禁悠。三九已至,卻和暖如春兑宇,著一層夾襖步出監(jiān)牢的瞬間绷蹲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工顾孽, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留祝钢,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓若厚,卻偏偏與公主長得像拦英,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子测秸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容