
menu_main מסוג menu, ומוסיפים לו item עם title Save ו-onClick בשם menu_item_save_onclick. ב-Activity יוצרים את הפונקציה שמטפלת בו.onCreateOptionsMenu, מקבלים getMenuInflater() וקוראים ל-inflate עם R.menu.menu_main. מחזירים true.BitmapSaver שנכתב בעבר מקבל Bitmap, פותח FileOutputStream ושומר קובץ בתיקייה חיצונית עם שם שמורכב מתאריך ושעה והסיומת PNG. יש ב-manifest את ההרשאה WRITE_EXTERNAL_STORAGE, וכן מחלקה MyApp להקשר הכללי של האפליקציה.save ב-Painter: קוראים ל-setDrawingCacheEnabled(true), מקבלים את התמונה עם getDrawingCache(), שולחים אותה ל-BitmapSaver, ואז מחזירים את setDrawingCacheEnabled ל-false.BitmapSaver יכולה לזרוק IOException. הרכיב אינו אחראי להציג שגיאות, ולכן מוסיפים throws לחתימת save. מי שקורא מטפל בה.painter.save() ב-try/catch. ב-catch מוצג Toast עם הודעת השגיאה, ובהצלחה Toast עם "image has been successfully saved".הטקסט המלא של הדקות הראשונות בהרצאה «שמירה של Canvas לקובץ» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אז אחרי שראינו את ה-canvas ואיך אנחנו יכולים לכתוב תוכנית שפשוט אפשר לצייר איתה, בואו נראה עוד איזה פיצ'ר אחד וזה האפשרות לבצע שמירה של התמונה שעשינו לקובץ תמונה. אז לצורך השמירה בואו נארגן לעצמנו איזשהו תפריט שהוא התפריט של כל האפליקציה שיאפשר לבצע את השמירה.
נוסיף android resource, בואו נוסיף כבר resource file, נקרא לו מניו underline main ואנחנו רוצים שזה יהיה מניו נוסיף והנה אנחנו רואים כאן את תקיית המניו בתוך המניו אנחנו רוצים להוסיף אייטם ולתת לו טייטל סייב ואירוע און קליק מניו אייטם סייב underline
און קליק בצורה כזאת ניגש אליו ונגדיר שאנחנו רוצים to קריאייט און קליק איבנט הנדלר במיין אקטיביטי ופה אנחנו רוצים בעצם לבצע את השמירה.
אז קודם כל בואו נראה כמה דברים שיש לנו כאן בתוספת על הסרטון הקודם של הפיינט. מעבר לזה שיש לנו פה את הפיינט ויש לנו את הפיינטד פאף, יש לנו גם את המיי אפ שמתאר את הקונטקסט הכללי של האפליקציה כי אנחנו צריכים את זה בשביל לשמור את הקובץ.
יש לנו כאן באנדרואיד מניפסט את הפרמישן המתאים write external storage שמאפשר לנו לשמור את הקובץ ל external storage ויש לנו כאן ביטמאפ סייבר שזה בעצם קטע קוד שכבר היה לנו בעבר כאשר התעסקנו עם קבצים ותמונות שמאפשר פשוט לקבל ביטמאפ לפתוח file output stream לייצר קובץ רנדומלי או בעצם השם שלו לא רנדומלי, אלא
מתעסק עם ה... הוא מכיל את השנה, חודש, יום, קו תחתון, שעה, דקה, שנייה, עם הסיומת PNG, והוא יוצר אותו באקסטרנל דיירקטורי. אז אנחנו רואים שיש לנו פה את הפונקציה שמחזירה לנו שם של קובץ כולל נתיב, פותחים את ה-file output stream, כל הקודים האלה וקודים שכבר עשינו בעבר.
יש לנו כאן את הביטמאפ נקודה קומפרס, שמאפשרת לשמור את התמונה בפורמט PNG במקרה הזה. שימו לב שרק אם אנחנו נשמור בפורמט JPEG, אז אוטומטית יהיה לה background שחור, ו-PNG יהיה לה background שקוף, אז עדיף לשמור את זה עם PNG.
ויש לנו את הפקודה הזאת שביצעה איזשהו refresh, בכדי שמיידית היוזר יוכל לראות את התמונה במכשיר, בלי הצורך לבצע ריסטארט.
כל זה, זה דברים שעבדנו איתם, הכל כבר מוכן לנו ואנחנו רק רוצים בלחצן הסייב לבצע שמירה של אותה התמונה שציירנו אז אנחנו צריכים לגשת לפיינטר והמחלקה הזאת שכתבנו להוסיף בה פונקציה בואו נוסיף public void save איך אנחנו מבצעים את השמירה בכדי לבצע את השמירה אנחנו צריכים אובייקט ביטמאפ שמתאר את התמונה ואנחנו צריכים לקחת על ידי פונקציה שנקראת
דרווינג קאש. getDrawingCash זה פונקציה שבעצם שייכת למחלקת ה-view בגלל שגם אנחנו אובייקט view ירשנו אותה ויש לנו אותה. היא מביאה לנו את התמונה שמצוירת על ה-view אבל היא לא תצליח לעשות את זה מבלי שלפני זה נקרא לפונקציה שנקראת setDrawingCashEnabled true וזה מאפשר להעתיק את התמונה שמצוירת על ה-view,
כלומר להעתיק את התמונה הזאת מה-cash של ה-view עצמו, להגדיר שיש cash ושה-cash זה בעצם זיכרון שמחזיק את המידע הנוכחי, הוא פעיל, ואנחנו צריכים בסיום השמירה להעביר את זה ל-false.
בין ה-true לבין ה-false אנחנו מקבלים את ה-bitmap ואנחנו רוצים לשלוח את זה למחלקה שכתבנו, ביטמאפ סייבר, נקרא לביטמאפ סייבר סייב, הנה הביטמאפ ואנחנו רואים שיש לנו פה רק אקספשן כי המחלקה ביטמאפ סייבר היא זורקת חריגה או מתארת שהיא יכולה לזרוק חריגה מסוג i או אקספשן ואנחנו לא רוצים בתוך המחלקה הזאת להציג הודעות שגיאה כי זה לא
התפקיד שלה היא לא מחלקת ui וגם אנחנו בפיינטר לא מחלקת ui אז אנחנו לא רוצים להציג הודעות שגיאה, כלומר אנחנו כן מחלקה שמוצגת על ה-UI, אבל לא התפקיד שלנו לתקשר