अपने ऐप्लिकेशन में झलक जोड़ते समय, PreviewView का इस्तेमाल करें. यह एक View है, जिसे सही तरीके से दिखाने के लिए काटा-छांटा, छोटा-बड़ा, और घुमाया जा सकता है.
कैमरा चालू होने पर, इमेज की झलक PreviewView के अंदर मौजूद किसी सतह पर स्ट्रीम होती है.
PreviewView का इस्तेमाल करना
PreviewView का इस्तेमाल करके, CameraX के लिए झलक दिखाने की सुविधा लागू करने के लिए, यहां दिया गया तरीका अपनाएं. इसके बारे में बाद के सेक्शन में बताया गया है:
- इसके अलावा,
CameraXConfig.Providerको कॉन्फ़िगर करें. - अपने लेआउट में
PreviewViewजोड़ें. ProcessCameraProviderका अनुरोध करें.Viewबनाने पर,ProcessCameraProviderदेखें.- कोई कैमरा चुनें. इसके बाद, लाइफ़साइकल और इस्तेमाल के उदाहरणों को बाइंड करें.
PreviewView का इस्तेमाल करने की कुछ सीमाएं हैं. PreviewView का इस्तेमाल करते समय, ये काम नहीं किए जा सकते:
TextureViewऔरPreview.SurfaceProviderपर सेट करने के लिए,SurfaceTextureबनाएं.TextureViewसेSurfaceTextureको निकालें और उसेPreview.SurfaceProviderपर सेट करें.SurfaceViewसेSurfaceलें और उसेPreview.SurfaceProviderपर सेट करें.
इनमें से कुछ भी होने पर, Preview से PreviewView पर फ़्रेम स्ट्रीम होना बंद हो जाते हैं.
अपने लेआउट में PreviewView जोड़ना
यहां दिए गए सैंपल में, लेआउट में PreviewView को दिखाया गया है:
<FrameLayout android:id="@+id/container"> <androidx.camera.view.PreviewView android:id="@+id/previewView" /> </FrameLayout>
CameraProvider का अनुरोध करना
यहां दिए गए कोड से, CameraProvider का अनुरोध करने का तरीका पता चलता है:
// import androidx.camera.lifecycle.ProcessCameraProvider // import com.google.common.util.concurrent.ListenableFuture class MainActivity : ComponentActivity() { private lateinit var cameraProviderFuture: ListenableFuture<ProcessCameraProvider> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) cameraProviderFuture = ProcessCameraProvider.getInstance(this) } }
देखें कि CameraProvider उपलब्ध है या नहीं
CameraProvider का अनुरोध करने के बाद, पुष्टि करें कि व्यू बनने पर, इसकी शुरुआत हो गई है. यहां दिए गए कोड से पता चलता है कि ऐसा कैसे किया जा सकता है:
cameraProviderFuture.addListener( Runnable { val cameraProvider = cameraProviderFuture.get() bindPreview(cameraProvider) }, ContextCompat.getMainExecutor(this) )
इस सैंपल में इस्तेमाल किए गए bindPreview फ़ंक्शन का उदाहरण देखने के लिए, अगले सेक्शन में दिया गया कोड देखें.
कोई कैमरा चुनें और लाइफ़साइकल और इस्तेमाल के उदाहरणों को बाइंड करें
CameraProvider बनाने और उसकी पुष्टि करने के बाद, यह तरीका अपनाएं:
Previewबनाएं.- कैमरे के लिए, अपनी पसंद का
LensFacingविकल्प चुनें. - चुने गए कैमरे और इस्तेमाल के किसी भी उदाहरण को लाइफ़साइकल से बाइंड करें.
PreviewकोPreviewViewसे कनेक्ट करें.
यहां दिए गए कोड में एक उदाहरण दिखाया गया है:
fun bindPreview(cameraProvider: ProcessCameraProvider) { var preview: Preview = Preview.Builder() .build() var cameraSelector: CameraSelector = CameraSelector.Builder() .requireLensFacing(CameraSelector.LENS_FACING_BACK) .build() preview.setSurfaceProvider(previewView.getSurfaceProvider()) var camera = cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview) }
ध्यान दें कि bindToLifecycle(), Camera ऑब्जेक्ट लौटाता है. ज़ूम और एक्सपोज़र जैसे कैमरा आउटपुट को कंट्रोल करने के बारे में ज़्यादा जानने के लिए, कैमरा आउटपुट देखें.
अब आपने कैमरे की झलक दिखाने की सुविधा लागू कर ली है. अपना ऐप्लिकेशन बनाएं और पुष्टि करें कि झलक आपके ऐप्लिकेशन में दिख रही है और आपकी उम्मीद के मुताबिक काम कर रही है.
PreviewView के लिए अतिरिक्त कंट्रोल
CameraX PreviewView, प्रॉपर्टी को कॉन्फ़िगर करने के लिए कुछ अतिरिक्त एपीआई उपलब्ध कराता है. जैसे:
- झलक वाली स्ट्रीम रेंडर करने के लिए, लागू करने का मोड.
- झलक दिखाने वाली इमेज का स्केल टाइप.
लागू करने का मोड
PreviewView, टारगेट View पर झलक वाली स्ट्रीम को रेंडर करने के लिए, इनमें से किसी एक मोड का इस्तेमाल कर सकता है:
PERFORMANCEडिफ़ॉल्ट मोड है.PreviewView, वीडियो स्ट्रीम दिखाने के लिएSurfaceViewका इस्तेमाल करता है. हालांकि, कुछ मामलों में यहTextureViewका इस्तेमाल करता है.SurfaceViewमें ड्रॉइंग के लिए एक खास सरफ़ेस होता है. इसमें इंटरनल हार्डवेयर कंपोज़िटर की मदद से, हार्डवेयर ओवरले को लागू करने की संभावना ज़्यादा होती है. खास तौर पर, तब जब वीडियो की झलक के ऊपर कोई अन्य यूज़र इंटरफ़ेस (यूआई) एलिमेंट (जैसे, बटन) न हो. हार्डवेयर ओवरले की मदद से रेंडर करने पर, वीडियो फ़्रेम जीपीयू पाथ का इस्तेमाल नहीं करते. इससे प्लैटफ़ॉर्म की बैटरी की खपत और इंतज़ार का समय कम हो सकता है.COMPATIBLEमोड. इस मोड में,PreviewViewएकTextureViewका इस्तेमाल करता है.SurfaceViewके उलट, इसमें ड्रॉइंग के लिए कोई खास सरफ़ेस नहीं होता. इस वजह से, वीडियो को ब्लेंड करके रेंडर किया जाता है, ताकि उसे दिखाया जा सके. इस अतिरिक्त चरण के दौरान, ऐप्लिकेशन बिना किसी पाबंदी के वीडियो को स्केल करने और घुमाने जैसी अतिरिक्त प्रोसेसिंग कर सकता है.
अपने ऐप्लिकेशन के लिए सही मोड चुनने के लिए, PreviewView.setImplementationMode() का इस्तेमाल करें. अगर डिफ़ॉल्ट PERFORMANCE मोड आपके ऐप्लिकेशन के लिए सही नहीं है, तो यहां दिए गए कोड सैंपल में COMPATIBLE मोड को सेट करने का तरीका बताया गया है:
// viewFinder is a PreviewView instance. viewFinder.implementationMode = PreviewView.ImplementationMode.COMPATIBLE
स्केल टाइप
जब झलक वाले वीडियो का रिज़ॉल्यूशन, आपके टारगेट PreviewView के डाइमेंशन से अलग होता है, तो वीडियो कॉन्टेंट को व्यू में फ़िट करना पड़ता है. इसके लिए, वीडियो को काटा-छांटा जाता है या लेटरबॉक्स किया जाता है. इससे वीडियो का ओरिजनल आसपेक्ट रेशियो (लंबाई-चौड़ाई का अनुपात) बना रहता है. इस मकसद के लिए, PreviewView ये ScaleTypes उपलब्ध कराता है:
लेटरबॉक्सिंग के लिए,
FIT_CENTER,FIT_START, औरFIT_END. पूरे वीडियो वाले कॉन्टेंट को टारगेटPreviewViewमें दिखाए जा सकने वाले ज़्यादा से ज़्यादा साइज़ के हिसाब से, छोटा या बड़ा किया जाता है. हालांकि, पूरा वीडियो फ़्रेम दिखने के बावजूद, स्क्रीन का कुछ हिस्सा खाली दिख सकता है. इन तीनों में से चुने गए स्केल टाइप के आधार पर, वीडियो फ़्रेम टारगेट व्यू के बीच में, शुरुआत में या आखिर में अलाइन होता है.FILL_CENTER,FILL_START,FILL_END, क्रॉप करने के लिए. अगर किसी वीडियो का आसपेक्ट रेशियो (लंबाई-चौड़ाई का अनुपात)PreviewViewनहीं है, तो वीडियो का सिर्फ़ कुछ हिस्सा दिखता है. हालांकि, वीडियो पूरीPreviewViewस्क्रीन पर दिखता है.
CameraX, डिफ़ॉल्ट रूप से FILL_CENTER स्केल टाइप का इस्तेमाल करता है. अपने ऐप्लिकेशन के लिए सबसे सही स्केल टाइप सेट करने के लिए, PreviewView.setScaleType() का इस्तेमाल करें. यहां दिया गया कोड सैंपल, FIT_CENTER स्केल टाइप सेट करता है:
// viewFinder is a PreviewView instance. viewFinder.scaleType = PreviewView.ScaleType.FIT_CENTER
वीडियो दिखाने की प्रोसेस में ये चरण शामिल हैं:
- वीडियो को स्केल करना:
FIT_*स्केल टाइप के लिए, वीडियो कोmin(dst.width/src.width, dst.height/src.height)के साथ स्केल करें.FILL_*स्केल टाइप के लिए, वीडियो कोmax(dst.width/src.width, dst.height/src.height)के साथ स्केल करें.
- स्केल किए गए वीडियो को डेस्टिनेशन
PreviewViewके साथ अलाइन करें:FIT_CENTER/FILL_CENTERके लिए, स्केल किए गए वीडियो और डेस्टिनेशनPreviewViewको बीच में अलाइन करें.FIT_START/FILL_STARTके लिए, स्केल किए गए वीडियो और डेस्टिनेशनPreviewViewको हर एक के सबसे ऊपर बाएं कोने के हिसाब से अलाइन करें.FIT_END/FILL_ENDके लिए, स्केल किए गए वीडियो और डेस्टिनेशनPreviewViewको हर एक के सबसे नीचे दाएं कोने के हिसाब से अलाइन करें.
उदाहरण के लिए, यहां 640x480 रिज़ॉल्यूशन वाला सोर्स वीडियो और 1920x1080 रिज़ॉल्यूशन वाला डेस्टिनेशन वीडियो दिया गया है
PreviewView:

यहां दी गई इमेज में, FIT_START / FIT_CENTER / FIT_END को स्केल करने की प्रोसेस दिखाई गई है:

यह प्रोसेस इस तरह काम करती है:
- वीडियो फ़्रेम को
min(1920/640, 1080/480) = 2.25से स्केल करें (ओरिजनल आसपेक्ट रेशियो को बनाए रखते हुए), ताकि 1440x1080 का इंटरमीडिएट वीडियो फ़्रेम मिल सके. - 1440x1080 वीडियो फ़्रेम को 1920x1080
PreviewViewके साथ अलाइन करें.FIT_CENTERके लिए, वीडियो फ़्रेम कोPreviewViewविंडो के सेंटर में अलाइन करें.PreviewViewके शुरुआती और आखिरी 240 पिक्सल कॉलम खाली हैं.FIT_STARTके लिए, वीडियो फ़्रेम कोPreviewViewविंडो के शुरुआत (सबसे ऊपर बाईं ओर) के साथ अलाइन करें.PreviewViewके आखिरी 480 पिक्सल कॉलम खाली हैं.FIT_ENDके लिए, वीडियो फ़्रेम कोPreviewViewविंडो के आखिर (सबसे नीचे दाईं ओर का कोना) में अलाइन करें.PreviewViewके शुरुआती 480 पिक्सल कॉलम खाली हैं.
यहां दी गई इमेज में, FILL_START / FILL_CENTER / FILL_END को स्केल करने की प्रोसेस दिखाई गई है:

यह प्रोसेस इस तरह काम करती है:
max(1920/640, 1080/480) = 3की मदद से वीडियो फ़्रेम को स्केल करें, ताकि 1920x1440 का इंटरमीडिएट वीडियो फ़्रेम मिल सके. यहPreviewViewके साइज़ से बड़ा होता है.- 1920x1440 वीडियो फ़्रेम को क्रॉप करें, ताकि वह 1920x1080
PreviewViewविंडो में फ़िट हो सके.FILL_CENTERके लिए, 1920x1440 के स्केल किए गए वीडियो के सेंटर से 1920x1080 को क्रॉप करें. वीडियो की ऊपर और नीचे की 180 लाइनें नहीं दिखती हैं.FILL_STARTके लिए, 1920x1440 के स्केल किए गए वीडियो की शुरुआत से 1920x1080 को काटें. वीडियो की सबसे नीचे की 360 लाइनें नहीं दिख रही हैं.FILL_ENDके लिए, 1920x1440 स्केल किए गए वीडियो के आखिर से 1920x1080 को काटें. वीडियो की सबसे ऊपर की 360 लाइनें नहीं दिख रही हैं.
अन्य संसाधन
CameraX के बारे में ज़्यादा जानने के लिए, यहां दिए गए अन्य संसाधन देखें.
कोडलैब (कोड बनाना सीखना)
कोड सैंपल