女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在Jetpack Compose中解鎖CameraX的強(qiáng)大功能

谷歌開(kāi)發(fā)者 ? 來(lái)源:Android 開(kāi)發(fā)者 ? 2025-02-25 11:50 ? 次閱讀

作者 / Google 開(kāi)發(fā)者關(guān)系工程師 Jolanda Verhoef

本文是 "相機(jī)與媒體 Spotlight Week" 系列的內(nèi)容之一。此系列中,我們會(huì)提供文章、視頻、示例代碼等資源,以幫助您提升應(yīng)用中的媒體體驗(yàn)。

我們了解到您喜歡 CameraX 和 Jetpack Compose 庫(kù)提供的強(qiáng)大功能,但希望使用更符合語(yǔ)言習(xí)慣的 Compose API 來(lái)構(gòu)建相機(jī)界面。今年,我們的工程團(tuán)隊(duì)開(kāi)發(fā)了兩個(gè)新的 Compose 工件,即低層級(jí) viewfinder-compose 和高層級(jí) camera-compose。兩者現(xiàn)在均已推出 alpha 版本 。

在本系列文章中,我們不僅將為您介紹如何將 camera-compose API 集成到應(yīng)用中,還將向您展示與 Compose 集成所帶來(lái)的一些令人愉悅的界面體驗(yàn)。所有令人贊嘆的 Compose 功能 (例如自適應(yīng) API 和動(dòng)畫支持) 均已與相機(jī)預(yù)覽無(wú)縫集成。

完成所有這些操作后,我們的最終應(yīng)用將如下所示:

此外,應(yīng)用可以順暢地在桌面模式之間切換:

到本文 (該系列第一篇文章) 的末尾,您將構(gòu)建一個(gè)功能齊全的相機(jī)取景器,并將在后續(xù)系列文章中對(duì)其進(jìn)行擴(kuò)展。歡迎您跟隨我們一起編寫代碼,在實(shí)踐中更好地學(xué)習(xí)。

添加庫(kù)依賴項(xiàng)

假設(shè)您已經(jīng)在應(yīng)用中設(shè)置了 Compose。如果您想繼續(xù),只需在 Android Studio 中新建一個(gè)應(yīng)用即可。我們通常使用最新的 Canary 版本,因?yàn)檫@個(gè)版本會(huì)提供最新的 Compose 模板。
向您的 libs.versions.toml 中添加以下內(nèi)容:

[versions]
..
camerax = "1.5.0-alpha03"
accompanist = "0.36.0" # or whatever matches with your Compose version


[libraries]
..
# Contains the basic camera functionality such as SurfaceRequest
androidx-camera-core = { module = "androidx.camera:camera-core", version.ref = "camerax" }
# Contains the CameraXViewfinder composable
androidx-camera-compose = { module = "androidx.camera:camera-compose", version.ref = "camerax" }
# Allows us to bind the camera preview to our UI lifecycle
androidx-camera-lifecycle = { group = "androidx.camera", name = "camera-lifecycle", version.ref = "camerax" }
# The specific camera implementation that renders the preview
androidx-camera-camera2 = { module = "androidx.camera:camera-camera2", version.ref = "camerax" }
# The helper library to grant the camera permission
accompanist-permissions = { module = "com.google.accompanist:accompanist-permissions", version.ref = "accompanist" }
然后,將這些添加到您的模塊 build.gradle.kts 依賴項(xiàng)塊中:
dependencies {
  ..
  implementation(libs.androidx.camera.core)
  implementation(libs.androidx.camera.compose)
  implementation(libs.androidx.camera.lifecycle)
  implementation(libs.androidx.camera.camera2)
  implementation(libs.accompanist.permissions)
}
?
為了授予相機(jī)權(quán)限,我們添加了所有依賴項(xiàng),然后實(shí)際顯示相機(jī)預(yù)覽。接下來(lái),讓我們看看如何授予正確的權(quán)限。

授予相機(jī)權(quán)限

通過(guò)使用 Accompanist 權(quán)限庫(kù),我們可以輕松地授予正確的相機(jī)權(quán)限。首先,我們需要設(shè)置 AndroidManifest.xml:


    
    


    ..


Accompanist 權(quán)限庫(kù)

https://google.github.io/accompanist/permissions/

現(xiàn)在,我們只需按照庫(kù)的說(shuō)明授予正確的權(quán)限:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            MyApplicationTheme {
                CameraPreviewScreen()
            }
        }
    }
}


@OptIn(ExperimentalPermissionsApi::class)
@Composable
fun CameraPreviewScreen(modifier: Modifier = Modifier) {
    val cameraPermissionState = rememberPermissionState(android.Manifest.permission.CAMERA)
    if (cameraPermissionState.status.isGranted) {
        CameraPreviewContent(modifier)
    } else {
        Column(
            modifier = modifier.fillMaxSize().wrapContentSize().widthIn(max = 480.dp),
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            val textToShow = if (cameraPermissionState.status.shouldShowRationale) {
                // If the user has denied the permission but the rationale can be shown,
                // then gently explain why the app requires this permission
                "Whoops! Looks like we need your camera to work our magic!" +
                    "Don't worry, we just wanna see your pretty face (and maybe some cats).  " +
                    "Grant us permission and let's get this party started!"
            } else {
                // If it's the first time the user lands on this feature, or the user
                // doesn't want to be asked again for this permission, explain that the
                // permission is required
                "Hi there! We need your camera to work our magic! 
" +
                    "Grant us permission and let's get this party started! uD83CuDF89"
            }
            Text(textToShow, textAlign = TextAlign.Center)
            Spacer(Modifier.height(16.dp))
            Button(onClick = { cameraPermissionState.launchPermissionRequest() }) {
                Text("Unleash the Camera!")
            }
        }
    }
}


@Composable
private fun CameraPreviewContent(modifier: Modifier = Modifier) {
    // TODO: Implement
}
這樣,我們就得到了一個(gè)良好的界面,用戶可以在顯示相機(jī)預(yù)覽之前授予相機(jī)權(quán)限:

創(chuàng)建 ViewModel

將業(yè)務(wù)邏輯與界面分開(kāi)是一種很好的實(shí)踐。為此,我們可以為屏幕創(chuàng)建視圖模型來(lái)實(shí)現(xiàn)這一點(diǎn)。這個(gè)視圖模型設(shè)置了 CameraX Preview 用例。請(qǐng)注意,CameraX 中的用例代表了可以使用該庫(kù)實(shí)現(xiàn)的各種工作流程的配置,即預(yù)覽、捕獲、錄制和分析。視圖模型還將界面綁定到相機(jī)提供程序:

class CameraPreviewViewModel : ViewModel() {
    // Used to set up a link between the Camera and your UI.
    private val _surfaceRequest = MutableStateFlow(null)
    val surfaceRequest: StateFlow = _surfaceRequest


    private val cameraPreviewUseCase = Preview.Builder().build().apply {
        setSurfaceProvider { newSurfaceRequest ->
            _surfaceRequest.update { newSurfaceRequest }
        }
    }


    suspend fun bindToCamera(appContext: Context, lifecycleOwner: LifecycleOwner) {
        val processCameraProvider = ProcessCameraProvider.awaitInstance(appContext)
        processCameraProvider.bindToLifecycle(
            lifecycleOwner, DEFAULT_FRONT_CAMERA, cameraPreviewUseCase
        )


        // Cancellation signals we're done with the camera
        try { awaitCancellation() } finally { processCameraProvider.unbindAll() }
    }
}

此處會(huì)執(zhí)行大量操作。代碼定義了一個(gè) CameraPreviewViewModel 類,負(fù)責(zé)管理相機(jī)預(yù)覽。此類使用 CameraX Preview 構(gòu)建器來(lái)配置預(yù)覽與界面的綁定方式。bindToCamera 函數(shù)用于初始化相機(jī),并將其綁定到指定的 LifecycleOwner,以確保相機(jī)至少在生命周期處于 "啟動(dòng)" 狀態(tài)時(shí)運(yùn)行,并啟動(dòng)預(yù)覽流。
相機(jī)作為相機(jī)庫(kù)的內(nèi)部組件,需要渲染到界面提供的 surface。因此,庫(kù)需要有一種方法來(lái)請(qǐng)求 surface。這正是 SurfaceRequest 的用途。因此,每當(dāng)相機(jī)表示需要 surface 時(shí),就會(huì)觸發(fā) surfaceRequest。然后將該請(qǐng)求轉(zhuǎn)發(fā)給界面,以便將 surface 傳遞給請(qǐng)求對(duì)象。

最后,我們需要等待界面與相機(jī)完成綁定,并確保釋放相機(jī)資源以避免資源泄漏。

實(shí)現(xiàn)相機(jī)預(yù)覽界面

現(xiàn)在我們有了一個(gè)視圖模型,可以實(shí)現(xiàn) CameraPreviewContent 可組合項(xiàng)。該項(xiàng)從視圖模型中讀取 surface 請(qǐng)求,在可組合項(xiàng)位于組合樹(shù)中時(shí)綁定到相機(jī),并從庫(kù)中調(diào)用 CameraXViewfinder。

@Composable
fun CameraPreviewContent(
    viewModel: CameraPreviewViewModel,
    modifier: Modifier = Modifier,
    lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current
) {
    val surfaceRequest by viewModel.surfaceRequest.collectAsStateWithLifecycle()
    val context = LocalContext.current
    LaunchedEffect(lifecycleOwner) { 
        viewModel.bindToCamera(context.applicationContext, lifecycleOwner) 
    }


    surfaceRequest?.let { request ->
        CameraXViewfinder(
            surfaceRequest = request,
            modifier = modifier
        )
    }
}


如上部分所述,surfaceRequest 允許相機(jī)庫(kù)在需要渲染時(shí)請(qǐng)求一個(gè) surface。在這段代碼中,我們收集這些 surfaceRequest 實(shí)例,并將它們轉(zhuǎn)發(fā)給屬于 camera-compose 組件的 CameraXViewfinder。

結(jié)果

就這樣,我們構(gòu)建了一個(gè)功能齊全的全屏取景器。了解完整代碼片段,請(qǐng)?jiān)L問(wèn)相關(guān)文檔:


https://gist.github.com/JolandaVerhoef/74d4696b804736c698450bd34b5c9ff8

本文中的代碼段包含以下許可證:

// Copyright 2024 Google LLC. SPDX-License-Identifier: Apache-2.0

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Google
    +關(guān)注

    關(guān)注

    5

    文章

    1787

    瀏覽量

    58668
  • 相機(jī)
    +關(guān)注

    關(guān)注

    4

    文章

    1431

    瀏覽量

    54474
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1562

    瀏覽量

    63515

原文標(biāo)題:在 Jetpack Compose 中解鎖 CameraX 的強(qiáng)大功能

文章出處:【微信號(hào):Google_Developers,微信公眾號(hào):谷歌開(kāi)發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    compose的使用技巧是什么?

    compose的使用技巧是什么?
    發(fā)表于 11-15 07:27

    深入了解CameraX 1.1版本的視頻拍攝功能

      CameraX 是一個(gè) Jetpack 支持庫(kù),旨在幫助您簡(jiǎn)化相機(jī)應(yīng)用的開(kāi)發(fā)工作。它提供一致且易用的 API 接口,適用于大多數(shù) Android 設(shè)備,并可向后兼容至 Android 5.0 (API 級(jí)別 21)。我們將在本文中介紹
    的頭像 發(fā)表于 01-25 12:01 ?3525次閱讀

    詳解Jetpack Compose 1.1版本的新功能

    我們一如既往地搭建產(chǎn)品路線圖,現(xiàn)在已經(jīng)發(fā)布了 Jetpack Compose 的 1.1 版本,這是 Android 的現(xiàn)代原生界面工具包。此版本新增了一些功能,比如經(jīng)過(guò)優(yōu)化的焦點(diǎn)處理、觸摸目標(biāo)值
    的頭像 發(fā)表于 03-11 10:14 ?1617次閱讀

    Jetpack Compose基礎(chǔ)知識(shí)科普

    Jetpack Compose 是用于構(gòu)建原生 Android 界面的新工具包。它可簡(jiǎn)化并加快 Android 上的界面開(kāi)發(fā),使用更少的代碼、強(qiáng)大的工具和直觀的 Kotlin API,快速讓應(yīng)用生動(dòng)
    的頭像 發(fā)表于 04-02 13:38 ?3257次閱讀

    Compose社區(qū)的反響

    我們很高興地看到這些團(tuán)隊(duì)大規(guī)模和復(fù)雜的生產(chǎn)環(huán)境仔細(xì)地評(píng)估并使用了 Compose,所帶來(lái)的結(jié)果也不僅是讓界面開(kāi)發(fā)更清晰有趣,也帶來(lái)了更多工程上的收益。這只是其中幾個(gè)案例,因?yàn)?Play 商店排名前 1,000 的應(yīng)用中有超過(guò)
    的頭像 發(fā)表于 05-18 10:15 ?1221次閱讀

    Jetpack Compose 更新一覽 | 2022 Android 開(kāi)發(fā)者峰會(huì)

    作者 /?Android 開(kāi)發(fā)者關(guān)系工程師 Jolanda Verhoef 去年我們發(fā)布了 Jetpack Compose ,此后一直進(jìn)行優(yōu)化。我們已添加了新的功能并創(chuàng)造出
    的頭像 發(fā)表于 11-23 17:55 ?1425次閱讀

    Google計(jì)劃用Jetpack Compose來(lái)重建Android系統(tǒng)的設(shè)置應(yīng)用

    上周,Google 發(fā)布了 Android 14 的首個(gè)開(kāi)發(fā)者預(yù)覽版,除了那些最新的功能以外,Google 似乎還正在默默醞釀一個(gè)新的計(jì)劃 —— 用更現(xiàn)代的 Jetpack Compose 來(lái)逐步
    的頭像 發(fā)表于 02-18 11:16 ?1846次閱讀

    Compose for Wear OS 1.1 推出穩(wěn)定版: 了解新功能

    為 Wear OS 構(gòu)建出色的響應(yīng)式應(yīng)用。 ? Compose for Wear OS?1.1 版本 https://developer.android.google.cn/jetpack
    的頭像 發(fā)表于 02-22 01:30 ?1206次閱讀

    Kotlin聲明式UI框架Compose Multiplatform支持iOS

    JetBrains ?KotlinConf’23 大會(huì)上宣布,Compose Multiplatform 已支持 iOS,目前處于 alpha 階段。至此,Compose
    的頭像 發(fā)表于 04-24 09:12 ?1577次閱讀
    Kotlin聲明式UI框架<b class='flag-5'>Compose</b> Multiplatform支持iOS

    I/O 看未來(lái) | Jetpack功能一覽

    應(yīng)用構(gòu)建特色功能。Google Play 上的大多數(shù)應(yīng)用都使用 Jetpack 進(jìn)行開(kāi)發(fā),事實(shí)上, 排行榜前 1,000 的應(yīng)用,超過(guò) 90% 的應(yīng)用都使用了
    的頭像 發(fā)表于 06-01 01:20 ?534次閱讀
    <b class='flag-5'>在</b> I/O 看未來(lái) | <b class='flag-5'>Jetpack</b> 新<b class='flag-5'>功能</b>一覽

    Jetpack WindowManager 1.1 穩(wěn)定版

    變化。許多新款設(shè)備都已進(jìn)入市場(chǎng),大量新用例也已解鎖Jetpack WindowManager 庫(kù)在幫助您優(yōu)化您的 Android 應(yīng)用上發(fā)揮重要作用,使其能夠適用于不同的設(shè)備類型。并且此版本還包含多項(xiàng)
    的頭像 發(fā)表于 10-18 19:10 ?598次閱讀
    <b class='flag-5'>Jetpack</b> WindowManager 1.1 穩(wěn)定版

    Jetpack Compose和設(shè)備類型的三大重要更新

    2024 年 Google I/O 大會(huì)上我們分享了大量更新和公告,幫助開(kāi)發(fā)者提升工作效率。了解 2024 年 Google I/O 大會(huì)上有關(guān) Jetpack Compose 和設(shè)備類型的三大重要更新。
    的頭像 發(fā)表于 08-09 17:07 ?935次閱讀

    NVIDIA JetPack 6.0版本的關(guān)鍵功能

    NVIDIA JetPack SDK 支持 NVIDIA Jetson 模塊,為構(gòu)建端到端加速 AI 應(yīng)用提供全面的解決方案。JetPack 6 通過(guò)微服務(wù)和一系列新功能,擴(kuò)展了 Jetson 平臺(tái)的靈活性和可擴(kuò)展性,是 202
    的頭像 發(fā)表于 09-09 10:18 ?947次閱讀
    NVIDIA <b class='flag-5'>JetPack</b> 6.0版本的關(guān)鍵<b class='flag-5'>功能</b>

    解析NVIDIA JetPack 6.1的新功能

    NVIDIA JetPack一直不斷發(fā)展,通過(guò)提供量身定制的先進(jìn)軟件滿足邊緣 AI 和機(jī)器人開(kāi)發(fā)者日益增長(zhǎng)的需求。每次發(fā)布的 JetPack 新版本都會(huì)升級(jí)性能、加入新功能與優(yōu)化現(xiàn)有
    的頭像 發(fā)表于 11-28 10:41 ?855次閱讀
    解析NVIDIA <b class='flag-5'>JetPack</b> 6.1的新<b class='flag-5'>功能</b>

    詳解Jetpack Compose布局流程

    我們與 Android 經(jīng)典視圖系統(tǒng)的生命周期 (Measure,Layout,Drawing) 做一個(gè)對(duì)比: 組合是 Compose 的特有階段,是其能夠通過(guò)函數(shù)調(diào)用實(shí)現(xiàn)聲明式 UI 的核心,想要深入理解 Compose 第一課就是理解這個(gè)過(guò)程。
    的頭像 發(fā)表于 02-05 13:38 ?567次閱讀
    詳解<b class='flag-5'>Jetpack</b> <b class='flag-5'>Compose</b>布局流程