
buttonSave) בפינה השמאלית התחתונה עם איקון דיסק ו-visibility="invisible". לחצן המצלמה במרכז (centerHorizontal) גלוי, ולחצן הביטול (buttonCancel) בצד ימין ומוסתר. לכל אחד onClick.CameraSurfaceView פונקציה ציבורית takePicture קוראת ל-camera.takePicture עם שלושה callbacks: shutter (null), raw (null) ו-JPEG (המחלקה עצמה). המחלקה מממשת Camera.PictureCallback.pictureBytes. השמירה מיד בעת הצילום, כדי שאם המשתמש יאשר, התמונה כבר זמינה לכתיבה לקובץ. פונקציה savePicture תבצע את הכתיבה (בשיעור הבא).takePicture, השמירה ל-savePicture, והביטול מחזיר למצב רגיל.refresh ברכיב שמסתירה אותו (GONE) ומציגה שוב (VISIBLE), וכך surfaceDestroyed ו-surfaceCreated רצים מחדש והתצוגה חיה שוב. קוראים לה מהשמירה ומהביטול.הטקסט המלא של הדקות הראשונות בהרצאה «מצלמה - חלק 5 - הוספת כפתורים» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אז אחרי שבנינו את ה-camera surface view ושמנו אותו ל-layout וכשאנחנו מריצים את האפליקציה אנחנו מצליחים לראות מתוך האפליקציה שלנו את מה שהמצלמה רואה, בואו נוסיף לחצנים בכדי לצלם את התמונה.
ולמעשה אנחנו רוצים להוסיף שלושה לחצנים. למה אנחנו צריכים שלושה לחצנים? לחצן אחד בשביל לבצע את הצילום עצמו ואז אנחנו רוצים להקפיא בעצם את הצילום כך שהמשתמש יראה אם הוא רוצה אותו או לא רוצה אותו.
ועוד שני לחצנים, האחד לבטל ולחזור בחזרה ואחד לשמור ואז כמובן גם לחזור בחזרה. אז בואו נוסיף פה שלושה לחצנים, יש לנו פה לחצן ראשון וניתן להם מימדים מסוימים. בואו נניח שהוויד ו-80 dp, הייט 80 dp בצורה כזאת.
הלחצן הראשון ניתן לו ID Button Save. לאחר מכן אנחנו רוצים Align Parent ו-Align Parent Bottom, זרקנו אותו למטה והלחצן שמבצע סייבינג ובעצם שומר את התמונה.
בואו ניקח וניתן לו בהתחלה Visibility Invisible, אנחנו לא רוצים שיראו אותו, אנחנו רוצים לתת לו איזשהו Background ויש לנו ב-Drawable את התמונה Save ואז אנחנו נוכל לראות בעצם מעין דיסק כזה שמאפשר למשתמש לראות שהוא יכול לשמור את התמונה, וניתן לו on click, בטון סייב, on click.
והנה יש לנו את הלחצן הראשון. אנחנו יכולים לקחת אותו, להעתיק, להדביק פעמיים. הלחצן השני שאנחנו רוצים, זה בעצם הולך להיות הלחצן האמצעי, בואו נקרא לו קאמרה, והוא מכיל תמונה של קאמרה.
בהתחלה הלחצן הזה יהיה visibility visible ואז רואים אותו ואנחנו רוצים לשים אותו באמצע אז בואו נגדיר במקום align parent left center horizontal true ואז הוא מופיע באמצע.
לחצן אחרון זה יהיה cancel ניתן לו אייקון cancel ואנחנו רוצים להעביר אותו ימינה ואז הוא מופיע בצד ימין ואנחנו רואים שלושה לחצנים כאן אנחנו רואים את הלחצן שמבטל, פה הלחצן באמצע מצלם ופה הלחצן מאפשר לשמור את התמונה שצולמה. בהתחלה המשתמש רואה רק את הלחצן של הקאמרה, ברגע שהוא לוחץ עליה התמונה צריכה לקפוא
ואנחנו צריכים להציג לו את שני הלחצנים שבצדדים ולא להציג לו את לחצן הקאמרה. אם הוא בוחר לבטל אז אנחנו רוצים פשוט להחזיר את הכל כפי שהיה, אם הוא בוחר לשמור אנחנו שומרים את התמונה וגם מחזירים את הכל כפי שהיה.
כעת אנחנו רוצים לגשת לרכיב שבנינו, ל-camera surface view ולאפשר דרך הרכיב הזה לבצע את הצילום עצמו. אז בואו ניגש לכאן ונוסיף עוד פונקציה public void take picture זאת פונקציה שפשוט אנחנו יכולים לקרוא לה מבחוץ והיא אמורה לבצע את הצילום עצמו, שמוצג כרגע ב-surface view.
בתוך הפונקציה takePicture אנחנו רוצים לבצע צילום של התמונה שמוצגת על ה-surface. אז יש לנו camera.takePicture. הפונקציה takePicture מקבלת שלושה פרמטרים. הפרמטר הראשון זה callback עבור ה-shutter, עבור הצמצם כביכול של המצלמה, בשביל להודיע לנו מתי בדיוק התמונה מתבצעת או נלקחת.
אנחנו לא רוצים לדעת בדיוק מתי המצלמה מצלמת את התמונה, כי אנחנו יודעים שהתמונה פחות או יותר מצטלמת עכשיו. נעביר פה נ"ל. הפרמטר השני זה callback בכדי לקבל את ה-row data של התמונה, והפרמטר השלישי זה callback של התמונה המכווצת כבר בפורמט JPEG.
אז בואו ניגש ונחזיר גם, נשלח גם פה נ"ל, ולפרמטר השלישי ניתן this, כי אנחנו רוצים כבר לקבל את התמונה בפורמט JPEG.
כאן אנחנו יודעים שהמחלקה שלנו צריכה לממש את הליסנר הזה, אז בואו ניגש ונלחץ על Alt, Enter, Make Camera Surface View Implement at a Picture Callback, ואנחנו רואים שיש לנו רק פונקציה אחת כאן, בואו ניגש ונראה איך נקראת הפונקציה הזאת, היא נקראת OnPictureTaken, והפונקציה הזאת נותנת
לנו את אובייקט התמונה, כמערך בתים אנחנו רואים פה את המצלמה שצילמה את התמונה או בייקט המצלמה ליתר דיוק ואת התמונה עצמה. מה שאנחנו רוצים לעשות זה לשמור את התמונה באיזשהו משתנה גלובלי כאן בואו נגדיר כאן משתנה private byte array נקרא לו picture byte ניגש לפונקציה שמחזירה לנו את אובייקט התמונה ופשוט נשים את הדאטה באזור הגלובלי.
למה? כי כשהיוזר מבצע את הצילום של התמונה הוא עדיין לא החליט אם הוא רוצה אותה או רוצה לבטל בכלל את הצילום הזה לכן אנחנו קודם כל מבצעים את השמירה של התמונה כאשר התמונה נלקחת או מתבצע צילום שלה.
ואם היוזר ירצה לשמור את התמונה אז בעצם אנחנו שמרנו כבר את התמונה פה בפיקצ'ר בייטס ואנחנו נוכל לשמור לו אותה לקובץ חיצוני. אנחנו רוצים עוד איזושהי פונקציה כאן שמבצעת את השמירה עצמה.
בואו נגדיר public void save picture וכאן אנחנו רוצים לבצע שמירה של התמונה. אז אנחנו תכף נבצע שמירה של התמונה, לפני זה אנחנו רוצים לטפל בקריאות לפונקציות האלה, לפונקציית הביטול ולפונקציית הצילום ולראות איך כל הסיפור הזה עובד.
עדיין אנחנו לא מבצעים שמירה של התמונה, את זה כבר נבצע.