PracticU

מצלמה - חלק 5 - הוספת כפתורים

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA › מצלמה - חלק 5 - הוספת כפתורים
מילון מושגים:
לייאאוט - ארגון וסידור הרכיבים החזותיים על המסך או בדף, כמו מיקום כפתורים, טקסט ותמונות.
רכיב - יחידת בניין עצמאית וניתנת לשימוש חוזר בתוך מערכת או ממשק משתמש, שאחראית על חלק מוגדר מהתפקוד.
פונקציה - קטע קוד בעל שם שמבצע משימה מוגדרת, מקבל ערכי קלט (פרמטרים) ויכול להחזיר תוצאה. מאפשרת לארגן קוד ולהשתמש בו שוב.
מחלקה - תבנית בתכנות מונחה עצמים שמגדירה אילו נתונים ופעולות יהיו לאובייקטים שנוצרים ממנה.
מערך - מבנה נתונים שמאחסן אוסף ערכים מאותו סוג ברצף, שאפשר לגשת אליהם לפי מספר מיקום (אינדקס).
תמונה - קובץ גרפי המוצג על המסך. בהקשר של וירטואליזציה או Docker, תבנית מוכנה שממנה יוצרים מכונה או קונטיינר.
חריגה - מצב שגיאה שמתרחש בזמן ריצת התוכנית ומפסיק את המהלך הרגיל, אלא אם הקוד תופס ומטפל בו.

מצלמה - חלק 5 - הוספת כפתורים
בשיעור מוסיפים ל-CameraSurfaceView שלושה לחצנים: צילום, ביטול ושמירה. אחרי הצילום התצוגה קופאת כדי שהמשתמש יחליט אם לשמור.
השלבים העיקריים
1. שלושה לחצנים ב-Layout: כל אחד 80dp על 80dp. לחצן השמירה (buttonSave) בפינה השמאלית התחתונה עם איקון דיסק ו-visibility="invisible". לחצן המצלמה במרכז (centerHorizontal) גלוי, ולחצן הביטול (buttonCancel) בצד ימין ומוסתר. לכל אחד onClick.
2. takePicture ברכיב: ב-CameraSurfaceView פונקציה ציבורית takePicture קוראת ל-camera.takePicture עם שלושה callbacks: shutter (null), raw (null) ו-JPEG (המחלקה עצמה). המחלקה מממשת Camera.PictureCallback.
3. onPictureTaken: שומרת את מערך הבתים בשדה גלובלי pictureBytes. השמירה מיד בעת הצילום, כדי שאם המשתמש יאשר, התמונה כבר זמינה לכתיבה לקובץ. פונקציה savePicture תבצע את הכתיבה (בשיעור הבא).
4. לחצנים כשדות: מאתרים את שלושת הלחצנים ב-MainActivity, כדי לשלוט בנראות שלהם. הצילום קורא ל-takePicture, השמירה ל-savePicture, והביטול מחזיר למצב רגיל.
5. toggleButtons: פונקציה פרטית שהופכת את הנראות של כל אחד משלושת הלחצנים (גלוי לבלתי נראה ולהפך). קוראים לה מכל אחד מהם, כך שאחרי צילום מוצגים השמירה והביטול ומוסתר לחצן המצלמה, ואחרי שמירה או ביטול חוזרים להפך.
6. Refresh לתצוגה: התצוגה נשארה קפואה ולחיצה נוספת גרמה ל-exception. הפתרון הוא פונקציית refresh ברכיב שמסתירה אותו (GONE) ומציגה שוב (VISIBLE), וכך surfaceDestroyed ו-surfaceCreated רצים מחדש והתצוגה חיה שוב. קוראים לה מהשמירה ומהביטול.
אחרי ההרצה הצילום מקפיא את התצוגה, והביטול מחזיר אותה לחיים. שמירת הקובץ עצמו עדיין לא מומשה.
השיעור הבא בקורס: מצלמה - חלק 6 - שמירת קובץ תמונה

פרקי ההרצאה: מצלמה - חלק 5 - הוספת כפתורים

  1. 00:00

    לחצנים לצילום, ביטול ושמירה

  2. 00:40

    הוספת לחצן השמירה ל-Layout

  3. 02:00

    לחצן המצלמה ולחצן הביטול

  4. 02:48

    התנהגות הלחצנים בזמן הצילום

  5. 03:28

    פונקציית takePicture ברכיב

  6. 04:07

    הפרמטרים של camera.takePicture

  7. 05:08

    קבלת התמונה ב-onPictureTaken

  8. 06:25

    פונקציית savePicture

תמלול ההרצאה: מצלמה - חלק 5 - הוספת כפתורים

הטקסט המלא של הדקות הראשונות בהרצאה «מצלמה - חלק 5 - הוספת כפתורים» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    אז אחרי שבנינו את ה-camera surface view ושמנו אותו ל-layout וכשאנחנו מריצים את האפליקציה אנחנו מצליחים לראות מתוך האפליקציה שלנו את מה שהמצלמה רואה, בואו נוסיף לחצנים בכדי לצלם את התמונה.

  2. 00:18

    ולמעשה אנחנו רוצים להוסיף שלושה לחצנים. למה אנחנו צריכים שלושה לחצנים? לחצן אחד בשביל לבצע את הצילום עצמו ואז אנחנו רוצים להקפיא בעצם את הצילום כך שהמשתמש יראה אם הוא רוצה אותו או לא רוצה אותו.

  3. 00:32

    ועוד שני לחצנים, האחד לבטל ולחזור בחזרה ואחד לשמור ואז כמובן גם לחזור בחזרה. אז בואו נוסיף פה שלושה לחצנים, יש לנו פה לחצן ראשון וניתן להם מימדים מסוימים. בואו נניח שהוויד ו-80 dp, הייט 80 dp בצורה כזאת.

  4. 00:57

    הלחצן הראשון ניתן לו ID Button Save. לאחר מכן אנחנו רוצים Align Parent ו-Align Parent Bottom, זרקנו אותו למטה והלחצן שמבצע סייבינג ובעצם שומר את התמונה.

  5. 01:21

    בואו ניקח וניתן לו בהתחלה Visibility Invisible, אנחנו לא רוצים שיראו אותו, אנחנו רוצים לתת לו איזשהו Background ויש לנו ב-Drawable את התמונה Save ואז אנחנו נוכל לראות בעצם מעין דיסק כזה שמאפשר למשתמש לראות שהוא יכול לשמור את התמונה, וניתן לו on click, בטון סייב, on click.

  6. 01:54

    והנה יש לנו את הלחצן הראשון. אנחנו יכולים לקחת אותו, להעתיק, להדביק פעמיים. הלחצן השני שאנחנו רוצים, זה בעצם הולך להיות הלחצן האמצעי, בואו נקרא לו קאמרה, והוא מכיל תמונה של קאמרה.

  7. 02:15

    בהתחלה הלחצן הזה יהיה visibility visible ואז רואים אותו ואנחנו רוצים לשים אותו באמצע אז בואו נגדיר במקום align parent left center horizontal true ואז הוא מופיע באמצע.

  8. 02:34

    לחצן אחרון זה יהיה cancel ניתן לו אייקון cancel ואנחנו רוצים להעביר אותו ימינה ואז הוא מופיע בצד ימין ואנחנו רואים שלושה לחצנים כאן אנחנו רואים את הלחצן שמבטל, פה הלחצן באמצע מצלם ופה הלחצן מאפשר לשמור את התמונה שצולמה. בהתחלה המשתמש רואה רק את הלחצן של הקאמרה, ברגע שהוא לוחץ עליה התמונה צריכה לקפוא

  9. 03:09

    ואנחנו צריכים להציג לו את שני הלחצנים שבצדדים ולא להציג לו את לחצן הקאמרה. אם הוא בוחר לבטל אז אנחנו רוצים פשוט להחזיר את הכל כפי שהיה, אם הוא בוחר לשמור אנחנו שומרים את התמונה וגם מחזירים את הכל כפי שהיה.

  10. 03:26

    כעת אנחנו רוצים לגשת לרכיב שבנינו, ל-camera surface view ולאפשר דרך הרכיב הזה לבצע את הצילום עצמו. אז בואו ניגש לכאן ונוסיף עוד פונקציה public void take picture זאת פונקציה שפשוט אנחנו יכולים לקרוא לה מבחוץ והיא אמורה לבצע את הצילום עצמו, שמוצג כרגע ב-surface view.

  11. 03:56

    בתוך הפונקציה takePicture אנחנו רוצים לבצע צילום של התמונה שמוצגת על ה-surface. אז יש לנו camera.takePicture. הפונקציה takePicture מקבלת שלושה פרמטרים. הפרמטר הראשון זה callback עבור ה-shutter, עבור הצמצם כביכול של המצלמה, בשביל להודיע לנו מתי בדיוק התמונה מתבצעת או נלקחת.

  12. 04:21

    אנחנו לא רוצים לדעת בדיוק מתי המצלמה מצלמת את התמונה, כי אנחנו יודעים שהתמונה פחות או יותר מצטלמת עכשיו. נעביר פה נ"ל. הפרמטר השני זה callback בכדי לקבל את ה-row data של התמונה, והפרמטר השלישי זה callback של התמונה המכווצת כבר בפורמט JPEG.

  13. 04:44

    אז בואו ניגש ונחזיר גם, נשלח גם פה נ"ל, ולפרמטר השלישי ניתן this, כי אנחנו רוצים כבר לקבל את התמונה בפורמט JPEG.

  14. 04:54

    כאן אנחנו יודעים שהמחלקה שלנו צריכה לממש את הליסנר הזה, אז בואו ניגש ונלחץ על Alt, Enter, Make Camera Surface View Implement at a Picture Callback, ואנחנו רואים שיש לנו רק פונקציה אחת כאן, בואו ניגש ונראה איך נקראת הפונקציה הזאת, היא נקראת OnPictureTaken, והפונקציה הזאת נותנת

  15. 05:20

    לנו את אובייקט התמונה, כמערך בתים אנחנו רואים פה את המצלמה שצילמה את התמונה או בייקט המצלמה ליתר דיוק ואת התמונה עצמה. מה שאנחנו רוצים לעשות זה לשמור את התמונה באיזשהו משתנה גלובלי כאן בואו נגדיר כאן משתנה private byte array נקרא לו picture byte ניגש לפונקציה שמחזירה לנו את אובייקט התמונה ופשוט נשים את הדאטה באזור הגלובלי.

  16. 05:54

    למה? כי כשהיוזר מבצע את הצילום של התמונה הוא עדיין לא החליט אם הוא רוצה אותה או רוצה לבטל בכלל את הצילום הזה לכן אנחנו קודם כל מבצעים את השמירה של התמונה כאשר התמונה נלקחת או מתבצע צילום שלה.

  17. 06:10

    ואם היוזר ירצה לשמור את התמונה אז בעצם אנחנו שמרנו כבר את התמונה פה בפיקצ'ר בייטס ואנחנו נוכל לשמור לו אותה לקובץ חיצוני. אנחנו רוצים עוד איזושהי פונקציה כאן שמבצעת את השמירה עצמה.

  18. 06:27

    בואו נגדיר public void save picture וכאן אנחנו רוצים לבצע שמירה של התמונה. אז אנחנו תכף נבצע שמירה של התמונה, לפני זה אנחנו רוצים לטפל בקריאות לפונקציות האלה, לפונקציית הביטול ולפונקציית הצילום ולראות איך כל הסיפור הזה עובד.

  19. 06:50

    עדיין אנחנו לא מבצעים שמירה של התמונה, את זה כבר נבצע.

לקורס המלא: קורס פיתוח אפליקציות לאנדרואיד

ההרצאה הקודמת: מצלמה - חלק 4 - צילום מתוך האפליקציה - המשך

ההרצאה הבאה: מצלמה - חלק 6 - שמירת קובץ תמונה

הרצאות קשורות מקורסים אחרים

  • הזזת מצלמה
  • הוספת VMkernel
  • הוספת Request לטסט
  • הוספת Maven Dependencies

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת JAVA - קורס ג'אווה למתחילים
  • קורס פיתוח אפליקציות - לאייפון iPhone iOS - ב-Swift-Xcode
  • קורס פלאטר - Flutter - שפת DART של גוגל למובייל - פיתוח אפליקציות לאנדרואיד ואייפון
  • קורס PhoneGap - פיתוח אפליקציות לאנדרואיד ואייפון