在2025華為開(kāi)發(fā)者大會(huì)的圖片和相機(jī)分論壇上,美顏相機(jī)分享了如何通過(guò)折疊屏鏡頭適配,打造多端一致的拍攝體驗(yàn)。隨著華為折疊屏產(chǎn)品的不斷豐富,相機(jī)開(kāi)發(fā)在折疊屏上也面臨獨(dú)特技術(shù)難題,鏡頭選錯(cuò)導(dǎo)致黑屏、角度設(shè)置錯(cuò)誤導(dǎo)致拉伸或者畫面旋轉(zhuǎn)的問(wèn)題日益凸顯。本文通過(guò)鏡頭選取、鏡頭接續(xù)、角度設(shè)置三個(gè)維度來(lái)探討在HarmonyOS折疊屏設(shè)備上更多創(chuàng)新的使用方式和更豐富的布局樣式。
統(tǒng)一、簡(jiǎn)易的鏡頭選取
HarmonyOS基于折疊狀態(tài)和鏡頭位置,精準(zhǔn)描述每一顆鏡頭,并僅上報(bào)當(dāng)前折疊狀態(tài)下的前后置鏡頭集合。這種機(jī)制確保了應(yīng)用能夠按照直板機(jī)鏡頭的使用習(xí)慣,直接通過(guò)位置信息打開(kāi)鏡頭,而HarmonyOS會(huì)自動(dòng)映射為當(dāng)前折疊狀態(tài)下的鏡頭。這種設(shè)計(jì)保障了直板機(jī)和折疊機(jī)在鏡頭使用上的統(tǒng)一性和兼容性,極大簡(jiǎn)化了開(kāi)發(fā)者的適配工作。
import{ camera }from'@kit.CameraKit'; import{BusinessError}from'@kit.BasicServicesKit'; import{ common }from'@kit.AbilityKit'; functiongetCameraManager(context: common.BaseContext): camera.CameraManager{ letcameraManager: camera.CameraManager= camera.getCameraManager(context); returncameraManager; } functiongetCameraDevices(cameraManager: camera.CameraManager):Array{ letcameraArray:Array = cameraManager.getSupportedCameras(); if(cameraArray !=undefined&& cameraArray.length>0) { for(letindex =0; index < cameraArray.length; index++) { ? ? ??console.info('cameraId : '?+ cameraArray[index].cameraId);?// 相機(jī)ID ? ? ??console.info('cameraPosition : '?+ cameraArray[index].cameraPosition);?// 相機(jī)位置 ? ? ??console.info('cameraType : '?+ cameraArray[index].cameraType);?// 相機(jī)類型 ? ? ??console.info('connectionType : '?+ cameraArray[index].connectionType);?// 相機(jī)連接類型 ? ? } ? ??return?cameraArray; ? }?else?{ ? ??console.error("cameraManager.getSupportedCameras error"); ? ??return?[]; ? } }
快捷的鏡頭切換方式
折疊設(shè)備形態(tài)各異,在相機(jī)應(yīng)用的開(kāi)發(fā)過(guò)程中需要統(tǒng)一的攝像頭切換方案,以確保用戶在拍照、錄像過(guò)程中獲得更好的體驗(yàn)。為了應(yīng)對(duì)折疊屏設(shè)備的動(dòng)態(tài)變化,HarmonyOS提供了兩種鏡頭切換方式,以滿足不同場(chǎng)景的需求:
方式1:應(yīng)用自主切換鏡頭
適用場(chǎng)景:適用于需要精致拍照體驗(yàn)的場(chǎng)景,如美顏相機(jī)。
實(shí)現(xiàn)方式:應(yīng)用需監(jiān)聽(tīng)折疊狀態(tài)的變化,自主完成鏡頭的啟停、切換,重新配置會(huì)話(涉及修改分辨率),重新查詢鏡頭能力范圍,并調(diào)整UX布局。
優(yōu)勢(shì):提供高度定制化的拍攝體驗(yàn),滿足復(fù)雜場(chǎng)景的需求。
import{ camera }from'@kit.CameraKit'; import{BusinessError}from'@kit.BasicServicesKit'; functionregisterFoldStatusChanged(err: BusinessError, foldStatusInfo: camera.FoldStatusInfo) { console.info('foldStatusChanged foldStatus: '+ foldStatusInfo.foldStatus); for(leti =0; i < foldStatusInfo.supportedCameras.length; i++) { ? ? ??// 選取當(dāng)前折疊狀態(tài)的前置鏡頭,進(jìn)行重新配流和UX布局調(diào)整 ? ? ??console.info(`foldStatusChanged camera[${i}]:?${foldStatusInfo.supportedCameras[i].cameraId}`); ? ? } } function?onFoldStatusChange(cameraManager: camera.CameraManager) { ? cameraManager.on('foldStatusChange', registerFoldStatusChanged); } function?offFoldStatusChange(cameraManager: camera.CameraManager) { ? cameraManager.off('foldStatusChange', registerFoldStatusChanged); }
方式2:系統(tǒng)自動(dòng)切換鏡頭
適用場(chǎng)景:適用于簡(jiǎn)單場(chǎng)景,如人臉識(shí)別。
實(shí)現(xiàn)方式:HarmonyOS自動(dòng)完成鏡頭切換、會(huì)話配置,應(yīng)用使能自動(dòng)切換鏡頭的能力時(shí),在有多個(gè)前置鏡頭的折疊設(shè)備上,不同的折疊狀態(tài)下可自動(dòng)切換到當(dāng)前可使用的前置鏡頭,避免前置鏡頭被折入內(nèi)部導(dǎo)致黑屏。
優(yōu)勢(shì):簡(jiǎn)化開(kāi)發(fā)流程,提升用戶體驗(yàn)的一致性和便捷性。
import{ camera }from'@kit.CameraKit'; functionenableAutoDeviceSwitchFn(session: camera.PhotoSession) { if(session.isAutoDeviceSwitchSupported()) { session.enableAutoDeviceSwitch(true); } }
簡(jiǎn)單易用的角度查詢?cè)O(shè)置能力
為了確保在不同折疊狀態(tài)下拍攝的照片和視頻保持正確的方向和角度,HarmonyOS相機(jī)采用了以下角度計(jì)算公式:
預(yù)覽:屏幕跟隨鏡頭一起旋轉(zhuǎn),因此預(yù)覽角度需考慮屏幕旋轉(zhuǎn)角度。
公式:旋轉(zhuǎn)角度 = 鏡頭安裝角度 + 屏幕旋轉(zhuǎn)角度
拍照/錄像:要保證照片/視頻正向存儲(chǔ),因此與設(shè)備旋轉(zhuǎn)角度相關(guān)。
公式:旋轉(zhuǎn)角度 = 前置:鏡頭安裝角度 – 設(shè)備旋轉(zhuǎn)角度
后置:鏡頭安裝角度 + 設(shè)備旋轉(zhuǎn)角度
通過(guò)這些角度計(jì)算,美顏相機(jī)確保了在不同折疊狀態(tài)下,用戶能夠獲得一致且高質(zhì)量的拍攝體驗(yàn)。
import{ camera }from'@kit.CameraKit'; import{BusinessError}from'@kit.BasicServicesKit'; import{ display }from'@kit.ArkUI'; // 以預(yù)覽舉例,previewOutput是創(chuàng)建的預(yù)覽輸出 letinitDisplayRotation = display.getDefaultDisplaySync().rotation; letinitPreviewRotation = previewOutput.getPreviewRotation(initDisplayRotation * camera.ImageRotation.ROTATION_90); previewOutput.setPreviewRotation(initPreviewRotation,false); display.off('change'); display.on('change',() =>{ // 在折疊狀態(tài)變化時(shí),重新查詢旋轉(zhuǎn)角度并下發(fā) initDisplayRotation = display.getDefaultDisplaySync().rotation; letimageRotation = initDisplayRotation * camera.ImageRotation.ROTATION_90; letpreviewRotation = previewOutput.getPreviewRotation(imageRotation); previewOutput.setPreviewRotation(previewRotation,false); });
開(kāi)發(fā)者可通過(guò)HarmonyOS開(kāi)發(fā)者官網(wǎng)查詢相關(guān)資料進(jìn)行開(kāi)發(fā)實(shí)踐,通過(guò)以下官網(wǎng)鏈路進(jìn)行體驗(yàn)參考(指南→媒體→相機(jī)服務(wù)→開(kāi)發(fā)相機(jī)應(yīng)用),助力開(kāi)發(fā)更高效便捷。
-
華為
+關(guān)注
關(guān)注
216文章
35572瀏覽量
259209 -
相機(jī)
+關(guān)注
關(guān)注
4文章
1511瀏覽量
55180 -
折疊屏
+關(guān)注
關(guān)注
3文章
539瀏覽量
16577 -
HarmonyOS
+關(guān)注
關(guān)注
80文章
2141瀏覽量
34905
原文標(biāo)題:【HarmonyOS相機(jī)開(kāi)發(fā)系列】折疊屏鏡頭切換優(yōu)秀實(shí)踐
文章出處:【微信號(hào):HarmonyOS_Dev,微信公眾號(hào):HarmonyOS開(kāi)發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Pura X****闊折疊適配:解鎖超視覺(jué)與高效交互的全新體驗(yàn)
鴻蒙5開(kāi)發(fā)寶藏案例分享---折疊屏懸停態(tài)開(kāi)發(fā)實(shí)踐
鴻蒙5開(kāi)發(fā)寶藏案例分享---折疊屏開(kāi)發(fā)實(shí)踐
外屏和寬屏浪費(fèi)了?HarmonyOS折疊屏設(shè)計(jì)規(guī)范教你用起來(lái)
一文帶你詳細(xì)了解HarmonyOS折疊屏設(shè)計(jì)規(guī)范!
harmonyos程序開(kāi)發(fā)如何暫時(shí)屏蔽折疊屏?
HarmonyOS原子化服務(wù)案例分享-馬仕健專輯
不止于大,如何打造優(yōu)秀的折疊屏應(yīng)用體驗(yàn)
折疊屏原理
HarmonyOS 測(cè)試技術(shù)與實(shí)踐-HarmonyOS 軟件測(cè)試技術(shù)棧

HarmonyOS折疊屏設(shè)計(jì)規(guī)范的新增亮點(diǎn)內(nèi)容
華為發(fā)布新版HarmonyOS折疊屏設(shè)計(jì)規(guī)范 持續(xù)引領(lǐng)折疊屏UI設(shè)計(jì)創(chuàng)新
華為發(fā)布新版HarmonyOS折疊屏設(shè)計(jì)規(guī)范 持續(xù)引領(lǐng)折疊屏UI設(shè)計(jì)創(chuàng)新
華為發(fā)布新版HarmonyOS折疊屏設(shè)計(jì)規(guī)范 持續(xù)引領(lǐng)折疊屏UI設(shè)計(jì)創(chuàng)新

HarmonyOS聯(lián)合綠盟發(fā)布折疊屏軟件規(guī)范,攜HUAWEI Mate X3帶來(lái)創(chuàng)新折疊體驗(yàn)

評(píng)論