PracticU

שמירה של Canvas לקובץ

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

שמירה של Canvas לקובץ
הוספת פיצ'ר שמירה לאפליקציית הציור: תפריט עם פריט Save ששומר את מה שצוייר כקובץ PNG במכשיר.
השלבים העיקריים
1. תפריט: יוצרים קובץ משאבים menu_main מסוג menu, ומוסיפים לו item עם title Save ו-onClick בשם menu_item_save_onclick. ב-Activity יוצרים את הפונקציה שמטפלת בו.
2. הצגת התפריט: דורסים onCreateOptionsMenu, מקבלים getMenuInflater() וקוראים ל-inflate עם R.menu.menu_main. מחזירים true.
3. קוד שנכתב קודם: BitmapSaver שנכתב בעבר מקבל Bitmap, פותח FileOutputStream ושומר קובץ בתיקייה חיצונית עם שם שמורכב מתאריך ושעה והסיומת PNG. יש ב-manifest את ההרשאה WRITE_EXTERNAL_STORAGE, וכן מחלקה MyApp להקשר הכללי של האפליקציה.
4. פונקציית save ב-Painter: קוראים ל-setDrawingCacheEnabled(true), מקבלים את התמונה עם getDrawingCache(), שולחים אותה ל-BitmapSaver, ואז מחזירים את setDrawingCacheEnabled ל-false.
5. טיפול בחריגה: BitmapSaver יכולה לזרוק IOException. הרכיב אינו אחראי להציג שגיאות, ולכן מוסיפים throws לחתימת save. מי שקורא מטפל בה.
6. בקריאה מהתפריט: עוטפים את painter.save() ב-try/catch. ב-catch מוצג Toast עם הודעת השגיאה, ובהצלחה Toast עם "image has been successfully saved".
7. בדיקה: מציירים בית עם אדמה, גג, חלון ודלת, לוחצים Save, ובודקים בגלריה ובאפליקציית Photos.
שימו לב
שומרים כ-PNG ולא כ-JPEG. ב-PNG הרקע שקוף, ולכן הגלריה מציגה אותו שחור, ו-Photos מציגה את הציור על רקע שחור או לבן לפי האפליקציה. ב-JPEG הרקע היה נשמר שחור.
כך אפשר לשמור את מה שצוייר ב-Canvas לקובץ תמונה על המכשיר.

פרקי ההרצאה: שמירה של Canvas לקובץ

  1. 00:00

    יצירת תפריט עם פריט Save

  2. 01:24

    הרשאת כתיבה ומחלקת BitmapSaver

  3. 02:21

    שמירה בפורמט PNG מול JPEG

  4. 03:16

    פונקציית save עם getDrawingCache

  5. 04:36

    טיפול בחריגת IOException

תמלול ההרצאה: שמירה של Canvas לקובץ

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

  1. 00:02

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

  2. 00:27

    נוסיף android resource, בואו נוסיף כבר resource file, נקרא לו מניו underline main ואנחנו רוצים שזה יהיה מניו נוסיף והנה אנחנו רואים כאן את תקיית המניו בתוך המניו אנחנו רוצים להוסיף אייטם ולתת לו טייטל סייב ואירוע און קליק מניו אייטם סייב underline

  3. 01:01

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

  4. 01:16

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

  5. 01:38

    יש לנו כאן באנדרואיד מניפסט את הפרמישן המתאים write external storage שמאפשר לנו לשמור את הקובץ ל external storage ויש לנו כאן ביטמאפ סייבר שזה בעצם קטע קוד שכבר היה לנו בעבר כאשר התעסקנו עם קבצים ותמונות שמאפשר פשוט לקבל ביטמאפ לפתוח file output stream לייצר קובץ רנדומלי או בעצם השם שלו לא רנדומלי, אלא

  6. 02:10

    מתעסק עם ה... הוא מכיל את השנה, חודש, יום, קו תחתון, שעה, דקה, שנייה, עם הסיומת PNG, והוא יוצר אותו באקסטרנל דיירקטורי. אז אנחנו רואים שיש לנו פה את הפונקציה שמחזירה לנו שם של קובץ כולל נתיב, פותחים את ה-file output stream, כל הקודים האלה וקודים שכבר עשינו בעבר.

  7. 02:35

    יש לנו כאן את הביטמאפ נקודה קומפרס, שמאפשרת לשמור את התמונה בפורמט PNG במקרה הזה. שימו לב שרק אם אנחנו נשמור בפורמט JPEG, אז אוטומטית יהיה לה background שחור, ו-PNG יהיה לה background שקוף, אז עדיף לשמור את זה עם PNG.

  8. 02:54

    ויש לנו את הפקודה הזאת שביצעה איזשהו refresh, בכדי שמיידית היוזר יוכל לראות את התמונה במכשיר, בלי הצורך לבצע ריסטארט.

  9. 03:05

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

  10. 03:41

    דרווינג קאש. getDrawingCash זה פונקציה שבעצם שייכת למחלקת ה-view בגלל שגם אנחנו אובייקט view ירשנו אותה ויש לנו אותה. היא מביאה לנו את התמונה שמצוירת על ה-view אבל היא לא תצליח לעשות את זה מבלי שלפני זה נקרא לפונקציה שנקראת setDrawingCashEnabled true וזה מאפשר להעתיק את התמונה שמצוירת על ה-view,

  11. 04:16

    כלומר להעתיק את התמונה הזאת מה-cash של ה-view עצמו, להגדיר שיש cash ושה-cash זה בעצם זיכרון שמחזיק את המידע הנוכחי, הוא פעיל, ואנחנו צריכים בסיום השמירה להעביר את זה ל-false.

  12. 04:36

    בין ה-true לבין ה-false אנחנו מקבלים את ה-bitmap ואנחנו רוצים לשלוח את זה למחלקה שכתבנו, ביטמאפ סייבר, נקרא לביטמאפ סייבר סייב, הנה הביטמאפ ואנחנו רואים שיש לנו פה רק אקספשן כי המחלקה ביטמאפ סייבר היא זורקת חריגה או מתארת שהיא יכולה לזרוק חריגה מסוג i או אקספשן ואנחנו לא רוצים בתוך המחלקה הזאת להציג הודעות שגיאה כי זה לא

  13. 05:07

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

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

ההרצאה הקודמת: שדרוג צייר שלנו על canvas

ההרצאה הבאה: אנימציה ראשונה שלי באנדרואיד

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

  • קריאה וכתיבה לקובץ ב-NodeJS
  • העברת Interceptors לקובץ נפרד
  • המרה של ETL לקובץ PCAP
  • העלאת הרשאות על ידי ניצול באגים בנתיב לקובץ

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

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