כשמוסיפים תצוגה מקדימה לאפליקציה, משתמשים ב-PreviewView, שהוא View שאפשר לחתוך, לשנות את הגודל שלו ולסובב אותו כדי להציג אותו בצורה נכונה.
התצוגה המקדימה של התמונה מוצגת ב-PreviewView כשהמצלמה מופעלת.
שימוש ב-PreviewView
כדי להטמיע תצוגה מקדימה ל-CameraX באמצעות PreviewView, צריך לבצע את השלבים הבאים, שמפורטים בקטעים הבאים:
- אפשר להגדיר
CameraXConfig.Provider. - מוסיפים
PreviewViewלפריסה. - מבקשים
ProcessCameraProvider. - כשיוצרים
View, צריך לבדוק אתProcessCameraProvider. - בוחרים מצלמה ומקשרים את מחזור החיים ותרחישי השימוש.
יש כמה מגבלות לשימוש ב-PreviewView. כשמשתמשים ב-PreviewView, אי אפשר לבצע את הפעולות הבאות:
- יוצרים
SurfaceTextureכדי להגדיר ב-TextureViewוב-Preview.SurfaceProvider. - מאחזרים את
SurfaceTextureמ-TextureViewומגדירים אותו ב-Preview.SurfaceProvider. - משיגים את
Surfaceמ-SurfaceViewומגדירים אותו ב-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 מספק כמה ממשקי API נוספים להגדרת מאפיינים כמו:
- מצב ההטמעה לעיבוד של שידורים בתצוגה מקדימה.
- סוג קנה המידה של התמונה לתצוגה מקדימה.
מצב הטמעה
PreviewView יכול להשתמש באחד מהמצבים הבאים כדי לעבד סטרימינג של תצוגה מקדימה ב-View היעד:
PERFORMANCEהוא מצב ברירת המחדל. PreviewViewמשתמש ב-SurfaceViewכדי להציג את שידור הווידאו, אבל במקרים מסוימים הוא חוזר ל-TextureView. ל-SurfaceViewיש משטח ציור ייעודי, שיש סיכוי גבוה יותר שיוטמע עם שכבת-על של חומרה על ידי הקומפוזיטור הפנימי של החומרה, במיוחד כשאין רכיבים אחרים בממשק המשתמש (כמו לחצנים) מעל הסרטון בתצוגה המקדימה. כשמבצעים עיבוד באמצעות שכבת-על של חומרה, הפריימים של הסרטון לא עוברים דרך ה-GPU, וכך אפשר להפחית את צריכת החשמל ואת זמן האחזור של הפלטפורמה.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ל-letterboxing. תוכן הסרטון המלא מותאם (מוגדל או מוקטן) לגודל המקסימלי שאפשר להציג ב-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:

בתמונה הבאה מוצג תהליך ההתאמה לעומס (scaling) של FIT_START / FIT_CENTER / FIT_END:

ככה זה עובד:
- משנים את קנה המידה של הפריים (תוך שמירה על יחס הגובה-רוחב המקורי) באמצעות
min(1920/640, 1080/480) = 2.25כדי לקבל פריים ביניים של 1440x1080. - מיישרים את הפריים של הסרטון ברזולוציה 1440x1080 עם
PreviewViewברזולוציה 1920x1080.- ב-
FIT_CENTER, ממקמים את הפריים של הסרטון במרכז החלון שלPreviewView. העמודות של 240 הפיקסלים בהתחלה ובסוף שלPreviewViewריקות. - ב-
FIT_START, מיישרים את הפריים של הסרטון עם ההתחלה (הפינה השמאלית העליונה) של החלון שלPreviewView. 480 הפיקסלים האחרונים של העמודות ב-PreviewViewריקים. - ב-
FIT_END, מיישרים את הפריים של הסרטון עם הסוף (הפינה הימנית התחתונה) של החלון שלPreviewView. עמודות הפיקסלים הראשונות (480) שלPreviewViewריקות.
- ב-
בתמונה הבאה מוצג תהליך ההתאמה לעומס (scaling) של FILL_START / FILL_CENTER / FILL_END:

ככה זה עובד:
- משנים את קנה המידה של הפריים באמצעות
max(1920/640, 1080/480) = 3כדי לקבל פריים ביניים בגודל 1920x1440 (גדול יותר מהגודל שלPreviewView). - חותכים את הפריים של הסרטון בגודל 1920x1440 כך שיתאים לחלון
PreviewViewבגודל 1920x1080.- ב-
FILL_CENTER, חותכים 1920x1080 ממרכז הסרטון ששונה ל-1920x1440. 180 השורות העליונות והתחתונות של הסרטון לא מוצגות. - ב-
FILL_START, חותכים 1920x1080 מההתחלה של הסרטון ששונה ל-1920x1440. 360 השורות התחתונות של הסרטון לא גלויות. - ב-
FILL_END, חותכים 1920x1080 מסוף הסרטון ששונה ל-1920x1440. 360 השורות העליונות של הסרטון לא גלויות.
- ב-
מקורות מידע נוספים
איפה אפשר למצוא מידע נוסף על CameraX?
Codelab
דוגמת קוד