מעבדת קוד זו היא חלק מהקורס המתקדם של Android בקורס Kotlin. כדי להפיק את המקסימום מהקורס הזה, אם עובדים על מעבדות הקוד ברצף, לא חובה לעשות זאת. כל שיעורי הקוד של הקורסים מופיעים בדף הנחיתה המתקדם של Android ב-Kotlin codelabs.
מבוא
ב-Android, יש מספר שיטות זמינות להטמעת גרפיקה דו-ממדית ואנימציות בהתאמה אישית בתצוגות.
בנוסף לשימוש בשרטוטים, תוכלו ליצור שרטוטים דו-ממדיים באמצעות שיטות הציור של הכיתה Canvas
. Canvas
הוא משטח ציור דו-ממדי עם שיטות לשרטוט. האפשרות הזו שימושית במקרים שבהם האפליקציה צריכה לשרטט את עצמה מחדש באופן קבוע, כי המשתמשים רואים שינויים לאורך זמן. בשיעור Lab זה תלמדו איך ליצור ולצייר על קנבס שמוצג בView
.
סוגי הפעולות שניתן לבצע על קנבס כוללים:
- ממלאים את כל הקנבס בצבע.
- יש לשרטט צורות, כמו מלבנים, קשתות ונתיבים בסגנון המוגדר באובייקט
Paint
. האובייקטPaint
מכיל את פרטי הסגנון והצבע לגבי ציור גיאומטריות (כגון קו, מלבן, אליפסה ושבילים) או, לדוגמה, על גוף הטקסט. - אפשר להחיל טרנספורמציות, כמו תרגום, שינוי גודל או טרנספורמציות בהתאמה אישית.
- קליפ. כלומר, אפשר להחיל צורה או נתיב על קנבס כדי להגדיר את החלקים הגלויים שלו.
איך אפשר לחשוב על ציור ב-Android (פשוט מאוד!)
ציור ב-Android או בכל מערכת מודרנית אחרת, הוא תהליך מורכב שכולל שכבות של הפשטות וביצוע אופטימיזציה עד לחומרה. האופן שבו Android מצייר הוא נושא מרתק לגבי הנושא שכתב, והפרטים שלו מעבר להיקף של קוד ה-Lab הזה.
בהקשר של Lab Lab זה, והאפליקציה שלו שמושכת הדפסה על קנבס בתצוגה במסך מלא, אפשר לחשוב על כך באופן הבא.
- נדרשת תצוגה כדי להציג את מה שאתה מצייר. ייתכן שזו אחת מהתצוגות שסופקו על ידי מערכת Android. לחלופין, במעבד הקוד הזה, תיצרו תצוגה מותאמת אישית שתשמש כתצוגת התוכן של האפליקציה (
MyCanvasView
). - כמו כל התצוגות האלה, היא מגיעה עם אזור עריכה משלה (
canvas
). - הדרך הבסיסית ביותר לציור על קנבס של תצוגה, מבטלת את השיטה
onDraw()
שלה ומשרטטת על קנבס. - כשיוצרים שרטוט, צריך לשמור את מה ששרטטתם לפני כן. יש כמה דרכים לשמור את הנתונים במטמון, שאחד מהם הוא מפת סיביות (
extraBitmap
). דרך אחרת היא לשמור היסטוריה של מה ששרטטת כקואורדינטות והוראות. - כדי לצייר את מפת סיביות לשמירה במטמון (
extraBitmap
) באמצעות ממשק ה-API של שרטוט לוח הציור, עליך ליצור לוח זמנים לשמירה במטמון (extraCanvas
) למפת המטמון. - לאחר מכן מציירים את לוח הציור שנמצא במטמון (
extraCanvas
), שמושך את עצמו למפת המטמון (extraBitmap
). - כדי להציג את כל מה שצייר על המסך, אמרתם להדפסות על קנבס (
canvas
) כדי לשרטט את מפת סיביות לשמירה במטמון (extraBitmap
).
דברים שחשוב לדעת
- איך ליצור אפליקציה עם פעילות, פריסה בסיסית ולהריץ אותה באמצעות Android Studio.
- איך לשייך רכיבי handler של אירועים לתצוגות מפורטות.
- כיצד ליצור תצוגה מפורטת מותאמת אישית.
מה תלמדו
- איך ליצור
Canvas
ולצייר עליו בתגובה מגע של המשתמש.
הפעולות שתבצעו:
- ניתן ליצור אפליקציה שמשרטטת קווים על המסך בתגובה למשתמש שנוגעים במסך.
- מצלמים אירועי תנועה ובתגובה, מציירים קווים על קנבס שמופיע בתצוגה מותאמת אישית במסך מלא.
אפליקציית MiniPaint משתמשת בתצוגה מותאמת אישית כדי להציג קו בתגובה לנגיעות של משתמשים, כפי שמוצג בצילום המסך שבהמשך.
שלב 1. יצירה של פרויקט MiniPaint
- יוצרים פרויקט Kotlin חדש בשם MiniPaint שמשתמש בתבנית ריק של פעילות.
- פותחים את הקובץ
app/res/values/colors.xml
ומוסיפים את שני הצבעים הבאים.
<color name="colorBackground">#FFFF5500</color>
<color name="colorPaint">#FFFFEB3B</color>
- פתיחה של
styles.xml
- בהורה של הסגנון
AppTheme
הנתון, יש להחליף אתDarkActionBar
ב-NoActionBar
. הפעולה הזו מסירה את סרגל הפעולות כדי שניתן יהיה לשרטט מסך מלא.
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
שלב 2. יצירת סיווג MyCanvasView
בשלב זה יוצרים תצוגה בהתאמה אישית, MyCanvasView
, לשרטוט.
- בחבילה
app/java/com.example.android.minipaint
, יוצרים חדש > קובץ Kotlin/Class בשםMyCanvasView
. - יש להפוך את הכיתה ל-
MyCanvasView
להרחיב את הכיתהView
ולעבור ביןcontext: Context
. מאשרים את ההצעות לייבוא.
import android.content.Context
import android.view.View
class MyCanvasView(context: Context) : View(context) {
}
שלב 3. הגדרת MyCanvasView כתצוגת התוכן
כדי להציג את מה ששרטטת בMyCanvasView
, יש להגדיר אותו כתצוגת התוכן של MainActivity
.
- פותחים את
strings.xml
ומגדירים מחרוזת לשימוש בתיאור התוכן של התצוגה המפורטת.
<string name="canvasContentDescription">Mini Paint is a simple line drawing app.
Drag your fingers to draw. Rotate the phone to clear.</string>
- פתיחה של
MainActivity.kt
- ב
onCreate()
, יש למחוק אתsetContentView(R.layout.activity_main)
. - יצירת מכונה של
MyCanvasView
.
val myCanvasView = MyCanvasView(this)
- למטה, מבקשים את המסך המלא לפריסה של
myCanvasView
. ניתן לעשות זאת על ידי הגדרת הדגלSYSTEM_UI_FLAG_FULLSCREEN
בתאריךmyCanvasView
. כך התצוגה תמלא את כל המסך.
myCanvasView.systemUiVisibility = SYSTEM_UI_FLAG_FULLSCREEN
- מוסיפים תיאור תוכן.
myCanvasView.contentDescription = getString(R.string.canvasContentDescription)
- למטה, מגדירים את תצוגת התוכן ל-
myCanvasView
.
setContentView(myCanvasView)
- מריצים את האפליקציה. יוצג מסך לבן לחלוטין, כי גודל הקנבס עדיין לא שרטטו ועדיין לא שרטטתם אותו.
שלב 1. שינוי ב-SizeChanged()
השיטה onSizeChanged()
מופעלת על ידי מערכת Android בכל פעם שתצוגה משתנה. בגלל שהתצוגה מתחילה ללא גודל, השיטה 'onSizeChanged()
' נקראת גם לאחר הפעילות הראשונה שנוצרת ומנוצלת על ידי הפעילות. לכן, שיטת onSizeChanged()
הזו היא המקום האידיאלי ליצירה ולהגדרה של הקנבס של התצוגה.
- ב-
MyCanvasView
, ברמת הכיתה, מגדירים משתנים עבור לוח הציור ומפת סיביות. צריך להתקשר למספרextraCanvas
ול-extraBitmap
. אלו מפת סיביות ולוח הציור שלך למטמון מה שכבר הוצג.
private lateinit var extraCanvas: Canvas
private lateinit var extraBitmap: Bitmap
- מגדירים משתנה ברמת הכיתה
backgroundColor
לצבע הרקע של אזור העריכה ומאפסים אותו ל-colorBackground
שהגדרתם קודם לכן.
private val backgroundColor = ResourcesCompat.getColor(resources, R.color.colorBackground, null)
- ב
MyCanvasView
, יש לשנות את השיטהonSizeChanged()
. שיטת הקריאה החוזרת הזו מופעלת על ידי מערכת Android עם מאפייני המסך ששונו, כלומר, עם רוחב וגובה חדשים (לשינוי) והרוחב והגובה הישנים (לשינוי מהם).
override fun onSizeChanged(width: Int, height: Int, oldWidth: Int, oldHeight: Int) {
super.onSizeChanged(width, height, oldWidth, oldHeight)
}
- בתוך
onSizeChanged()
, יוצרים מופע שלBitmap
עם הרוחב והגובה החדשים, שהם גודל המסך ומקצים אותו ל-extraBitmap
. הארגומנט השלישי הוא הגדרת צבע המפת. ב-ARGB_8888
נשמרות כל הצבעים ב-4 בייטים ומומלץ.
extraBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
- יש ליצור מופע של
Canvas
מ-extraBitmap
ולהקצות אותו ל-extraCanvas
.
extraCanvas = Canvas(extraBitmap)
- יש לציין את צבע הרקע שבו יש למלא את
extraCanvas
.
extraCanvas.drawColor(backgroundColor)
- כשמביטים ב-
onSizeChanged()
, מפת סיביות חדשה ולוח שיתופי נוצרים בכל פעם שהפונקציה מופעלת. אתם צריכים מפת סיביות חדשה, כי הגודל השתנה. עם זאת, זוהי דליפת זיכרון המשאירה מפות מפה ישנות. כדי לתקן את הבעיה, יש לעשות שימוש חוזר ב-extraBitmap
לפני יצירת הקוד הבא. כדי להוסיף את הקוד הזה אחרי השיחה אלsuper
,
if (::extraBitmap.isInitialized) extraBitmap.recycle()
שלב 2. ביטול OnDraw()
כל עבודות השרטוט עבור MyCanvasView
מתבצעות ב-onDraw()
.
כדי להתחיל, יש להציג את הקנבס, למלא את המסך בצבע הרקע שהוגדר ב-onSizeChanged()
.
- יש לשנות את
onDraw()
ולשרטט את התוכן שלextraBitmap
השמור במטמון באזור העריכה המשויך לתצוגה המפורטת. השיטהdrawBitmap()
Canvas
מגיעה בכמה גרסאות. בקוד הזה, עליכם לספק את מפת הביט, קואורדינטות ה-x וה-y (בפיקסלים) שבפינה השמאלית העליונה, וגםnull
ל-Paint
, כפי שתגדירו מאוחר יותר.
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
canvas.drawBitmap(extraBitmap, 0f, 0f, null)
}
לתשומת ליבך, אזור העריכה שמועבר אל onDraw()
ומשמש במערכת להצגת מפת הביטים שונה מהמפה שיצרת בשיטה onSizeChanged()
, ומשמשת לשרטוט במפת הביטים.
- הפעילו את האפליקציה. אתם אמורים לראות את כל המסך עם צבע הרקע שצוין.
כדי לצייר, צריך אובייקט Paint
שמציין מה הסגנון של שרטוט, ואובייקט Path
שמציין מה משרטט.
שלב 1. אתחול של אובייקט צבע
- ב-MyCanvasView.kt, מגדירים קובץ קבוע עבור רוחב הקו.
private const val STROKE_WIDTH = 12f // has to be float
- ברמת הכיתה ב-
MyCanvasView
, צריך להגדיר משתנהdrawColor
לצורך השהיית הצבע שיש לשרטט, ולהפעיל אותו באמצעות המשאבcolorPaint
כפי שהגדרתם קודם לכן.
private val drawColor = ResourcesCompat.getColor(resources, R.color.colorPaint, null)
- ברמת הכיתה, מוסיפים משתנה
paint
לאובייקטPaint
ומפעילים אותו באופן הבא.
// Set up the paint with which to draw.
private val paint = Paint().apply {
color = drawColor
// Smooths out edges of what is drawn without affecting shape.
isAntiAlias = true
// Dithering affects how colors with higher-precision than the device are down-sampled.
isDither = true
style = Paint.Style.STROKE // default: FILL
strokeJoin = Paint.Join.ROUND // default: MITER
strokeCap = Paint.Cap.ROUND // default: BUTT
strokeWidth = STROKE_WIDTH // default: Hairline-width (really thin)
}
- ה
color
מתוךpaint
הוא הdrawColor
שהגדרת קודם. - המדיניות
isAntiAlias
קובעת אם להחיל החלקה בקצה. אם מגדירים אתisAntiAlias
כ-true
, יותאם לקצוות של מה שצייר בלי להשפיע על הצורה. isDither
, כאשרtrue
, משפיע על האופן שבו צבעים ברמת דיוק גבוהה יותר מהמכשיר נלקחים בדגימה. לדוגמה, דהייה היא האמצעי הנפוץ ביותר להפחתת טווח הצבעים של התמונות ל-256 (או פחות).style
מגדיר את סוג השרטוט לביצוע לסימון קווים, שהוא למעשה קו.Paint.Style
מציין אם המקור הציורי מלא, מופרע או את שניהם (באותו צבע). ברירת המחדל היא למלא את האובייקט שעליו הוחל הצבע. ("Fill" צובע את חלקו הפנימי של הצורה, בעוד &"משיכת" עוקב אחר קווי המתאר שלו.)strokeJoin
מתוךPaint.Join
מציין איך קווים ופלחי עקומה מתחברים לאורך המסלול שנקטע. ערך ברירת המחדל הואMITER
.strokeCap
מגדיר את הצורה של סוף הקו כמכסה.Paint.Cap
מציין כיצד ההתחלה והסיום של הקווים והנתיבים שנחתכו. ערך ברירת המחדל הואBUTT
.strokeWidth
מציין את רוחב הקווים בפיקסלים. ברירת המחדל היא רוחב קו השיער, שהוא דק מאוד, כך שהוא מוגדר לקבועSTROKE_WIDTH
שהגדרתם קודם לכן.
שלב 2. אתחול של אובייקט נתיב
הPath
הוא הנתיב של מה שהמשתמש מצייר.
- ב-
MyCanvasView
, מוסיפים משתנהpath
ומאתחלים אותו עם אובייקטPath
כדי לאחסן את הנתיב שיש לשרטט כשנוגעים במסך של המשתמש. יבואandroid.graphics.Path
שלPath
.
private var path = Path()
שלב 1. תגובה לתנועה במסך
השיטה onTouchEvent()
בתצוגה מפורטת מופעלת בכל פעם שהמשתמש נוגע במסך.
- ב-
MyCanvasView
, צריך לעקוף את השיטהonTouchEvent()
כדי לשמור את הקואורדינטות שלx
ו-y
במטמון שלevent
. לאחר מכן, משתמשים בביטויwhen
כדי לטפל באירועי תנועה כדי לגעת למטה במסך, לנוע במסך ולשחרר את המגע במסך. אלו הם האירועים שמעניינים אותם מבחינת ציור קו על המסך. עבור כל סוג אירוע, יש לקרוא לשיטת שירות כפי שמוצג בקוד הבא. רשימה מלאה של אירועי מגע זמינה בתיעוד של הכיתהMotionEvent
.
override fun onTouchEvent(event: MotionEvent): Boolean {
motionTouchEventX = event.x
motionTouchEventY = event.y
when (event.action) {
MotionEvent.ACTION_DOWN -> touchStart()
MotionEvent.ACTION_MOVE -> touchMove()
MotionEvent.ACTION_UP -> touchUp()
}
return true
}
- ברמת הכיתה, מוסיפים את המשתנים
motionTouchEventX
ו-motionTouchEventY
לשמירה במטמון של ה-x וה-y של אירוע המגע הנוכחי (MotionEvent
הקואורדינטות). יש להפעיל אותם מחדש כדי0f
.
private var motionTouchEventX = 0f
private var motionTouchEventY = 0f
- אפשר ליצור סבכות לשלוש הפונקציות:
touchStart()
,touchMove()
ו-touchUp()
.
private fun touchStart() {}
private fun touchMove() {}
private fun touchUp() {}
- הקוד צריך לבנות ולהפעיל, אבל עדיין לא תראו שום דבר שונה מהרקע הצבעוני.
שלב 2. הטמעת touchStart()
השיטה הזו נקראת כשהמשתמש נוגע במסך בפעם הראשונה.
- ברמת הכיתה, מוסיפים משתנים כדי לשמור את הערכים האחרונים של x ו-y. אחרי שהמשתמש מפסיק לזוז ומרים את המגע, זו נקודת ההתחלה של הנתיב הבא (הקטע הבא של הקו).
private var currentX = 0f
private var currentY = 0f
- מטמיעים את השיטה
touchStart()
באופן הבא. יש לאפס אתpath
, לעבור לקואורדינטות ה-x של אירוע המגע (motionTouchEventX
ו-motionTouchEventY
), ולהקצות אתcurrentX
ואתcurrentY
לערך הזה.
private fun touchStart() {
path.reset()
path.moveTo(motionTouchEventX, motionTouchEventY)
currentX = motionTouchEventX
currentY = motionTouchEventY
}
שלב 3. הטמעה של touchMove()
- ברמת הכיתה, מוסיפים משתנה
touchTolerance
ומגדירים אותו ל-ViewConfiguration.get(context).scaledTouchSlop
.
private val touchTolerance = ViewConfiguration.get(context).scaledTouchSlop
אין צורך לשרטט כל פיקסל בנתיב ובכל פעם לרענן את המסך. במקום זאת, תוכלו (ווגם) לשתף פעולה בין נקודות בין הביצועים שלכם כדי לשפר את הביצועים.
- אם האצבע כמעט לא זזה, אין צורך לצייר.
- אם האצבע זזה פחות ממרחק של
touchTolerance
, אין לשרטט. scaledTouchSlop
מחזיר את המרחק בפיקסלים שניתן לנוע בהם לפני שהמערכת סבורה שהמשתמש גולל.
- עליך להגדיר את השיטה
touchMove()
. אפשר לחשב את המרחק שעברתם (dx
,dy
), ליצור עקומה בין שתי הנקודות ולשמור אותן ב-path
, לעדכן את ספירת הריצהcurrentX
ו-currentY
ולשרטט אתpath
. לאחר מכן, צריך להתקשר ל-invalidate()
כדי לאלץ שרטוט מחדש של המסך עם הגרסה המעודכנת שלpath
.
private fun touchMove() {
val dx = Math.abs(motionTouchEventX - currentX)
val dy = Math.abs(motionTouchEventY - currentY)
if (dx >= touchTolerance || dy >= touchTolerance) {
// QuadTo() adds a quadratic bezier from the last point,
// approaching control point (x1,y1), and ending at (x2,y2).
path.quadTo(currentX, currentY, (motionTouchEventX + currentX) / 2, (motionTouchEventY + currentY) / 2)
currentX = motionTouchEventX
currentY = motionTouchEventY
// Draw the path in the extra bitmap to cache it.
extraCanvas.drawPath(path, paint)
}
invalidate()
}
שיטה זו בפירוט רב יותר:
- חישוב המרחק שעבר (
dx, dy
). - אם התנועה הייתה מעבר לסובלנות המגע, מוסיפים פלח לנתיב.
- מגדירים את נקודת ההתחלה של הפלח הבא בנקודת הקצה של הפלח הזה.
- שימוש ב-
quadTo()
במקום ב-lineTo()
יאפשר לך לשרטט קו בצורה חלקה וללא פינות. תוכלו לעיין בעקומות עזים. - התקשרו אל
invalidate()
כדי להתקשר בסופו של דבר אלonDraw()
כדי לכוון את התצוגה שוב.
שלב 4: הטמעת TouchUp()
כאשר המשתמש מרים את המגע, כל מה שצריך הוא לאפס את הנתיב כדי שהוא לא יצויר שוב. לא משרטטים פריטים, כך שאין צורך לבטל את האימות.
- הטמעה של השיטה
touchUp()
.
private fun touchUp() {
// Reset the path so it doesn't get drawn again.
path.reset()
}
- מריצים את הקוד ומשתמשים באצבע על המסך כדי לצייר. לתשומת ליבכם, אם מסובבים את המכשיר, המסך נמחק כי מצב הציור לא נשמר. אפליקציה לדוגמה זו תוכננה כדי לספק למשתמש דרך פשוטה לנקות את המסך.
שלב 5: ציור מסגרת מסביב לשרטוט
כשהמשתמש מצייר את המסך, האפליקציה בונה את הנתיב ושומרת אותו במפת הסיביות extraBitmap
. השיטה onDraw()
מציגה את מפת סיביות הנוספת באזור העריכה של התצוגה. אפשר ליצור שרטוטים נוספים ב-onDraw()
. לדוגמה, ניתן לשרטט צורות לאחר ציור מפת הביטים.
בשלב זה, משרטטים מסגרת מסביב לקצה התמונה.
- במערכת ההפעלה
MyCanvasView
צריך להוסיף משתנה בשםframe
שכולל אובייקטRect
.
private lateinit var frame: Rect
- בסוף
onSizeChanged()
יש להגדיר היפוך, ולאחר מכן להוסיף קוד ליצירתRect
שישמש עבור המסגרת, באמצעות המאפיינים החדשים והמאפיין
.
// Calculate a rectangular frame around the picture.
val inset = 40
frame = Rect(inset, inset, width - inset, height - inset)
- ב
onDraw()
, אחרי ציור מפת סיביות, יש לשרטט מלבן.
// Draw a frame around the canvas.
canvas.drawRect(frame, paint)
- מפעילים את האפליקציה. שימו לב למסגרת.
משימה (אופציונלי): אחסון נתונים בנתיב
באפליקציה הנוכחית, פרטי הציור מאוחסנים במפת סיביות. זהו פתרון טוב, אבל הוא לא הדרך היחידה לאחסן פרטי שרטוט. הדרך שבה אתם מאחסנים את היסטוריית השרטוטים תלויה באפליקציה ובדרישות השונות. לדוגמה, אם אתה משרטט צורות, תוכל לשמור רשימה של צורות עם המיקום והמידות שלהן. באפליקציית MiniPaint אפשר לשמור את הנתיב בתור Path
. אם תרצו לנסות את זה, למטה מתוארת איך עושים את זה.
- ב-
MyCanvasView
, יש להסיר את כל הקוד שלextraCanvas
ושלextraBitmap
. - מוסיפים משתנים לנתיב עד עכשיו, ואת הנתיב שמוצג כרגע.
// Path representing the drawing so far
private val drawing = Path()
// Path representing what's currently being drawn
private val curPath = Path()
- ב-
onDraw()
, במקום לשרטט את מפת הביטים, יש לשרטט את המסלולים השמורים והנוכחיים.
// Draw the drawing so far
canvas.drawPath(drawing, paint)
// Draw any current squiggle
canvas.drawPath(curPath, paint)
// Draw a frame around the canvas
canvas.drawRect(frame, paint)
- ב-
touchUp()
, מוסיפים את הנתיב הנוכחי לנתיב הקודם ומאפסים את הנתיב הנוכחי.
// Add the current path to the drawing so far
drawing.addPath(curPath)
// Rewind the current path for the next touch
curPath.reset()
- מפעילים את האפליקציה. כן, לא אמור להיות שום שינוי.
צריך להוריד את הקוד של מעבדת הקוד שהסתיימה.
$ git clone https://github.com/googlecodelabs/android-kotlin-drawing-canvas
לחלופין, אפשר להוריד את המאגר כקובץ ZIP, לפתוח אותו ב-Android Studio ולפתוח אותו.
Canvas
הוא משטח ציור דו-ממדי עם שיטות לשרטוט.- ניתן לשייך את
Canvas
למופע שלView
שמוצג בו. - האובייקט
Paint
מכיל את פרטי הסגנון והצבע לגבי ציור גיאומטרים (כגון קו, מלבן, אליפסה ונתיבים) וטקסט. - דוגמה נפוצה לעבודה עם לוח הציור היא ליצור תצוגה בהתאמה אישית ולעקוף את השיטות
onDraw()
ו-onSizeChanged()
. - אפשר לעקוף את השיטה
onTouchEvent()
כדי למשוך מגע של משתמשים ולהגיב להם על ידי שרטוט דברים. - אתם יכולים להשתמש במפת סיביות נוספת כדי לשמור מידע במטמון עבור שרטוטים שמשתנים עם הזמן. לחלופין, אפשר לאחסן צורות או נתיב.
קורס אוניברסיטה:
התיעוד של מפתח Android:
Canvas
כיתהBitmap
כיתהView
כיתהPaint
כיתהBitmap.config
תצורותPath
כיתה- דף ויקיפדיה בזיר עקומות
- אזור העריכה ולוח הציור
- סדרת מאמרים בנושא ארכיטקטורה גרפית (מתקדם)
- שרטוטים
- onDraw()
- onSizeChanged()
MotionEvent
ViewConfiguration.get(context).scaledTouchSlop
בקטע הזה מפורטות מטלות שיעורי בית אפשריות לתלמידים שעובדים עם קוד Lab הזה, במסגרת קורס בהדרכת מורה. למורה יש אפשרות לבצע את הפעולות הבאות:
- אם צריך, מקצים שיעורי בית.
- ספרו לתלמידים איך מגישים מטלות בשיעורי בית.
- לתת ציונים למטלות שיעורי הבית.
המורים יכולים להשתמש בהצעות האלה כמה שפחות, ומומלץ להקצות להן כל שיעורי בית שדעתם מתאימה להם.
אם אתם עובדים בעצמכם על שיעור הקוד הזה, אתם מוזמנים להשתמש במטלות שיעורי הבית האלה כדי לבחון את הידע שלכם.
מענה על השאלות האלה
שאלה 1
אילו מהרכיבים הבאים נדרשים לצורך עבודה עם Canvas
? יש לבחור בכל האפשרויות הרלוונטיות.
▬ Bitmap
▬ Paint
▬ Path
▬ View
שאלה 2
מה עושה קריאה ל-invalidate()
(באופן כללי)?
▦ מתקן את האפליקציה ומפעיל אותה מחדש.
▬ למחוק את הציור ממפת הביטים.
הוספה מציין שהקוד הקודם לא צריך לפעול.
הוספה של הודעה מהמערכת על כך שהיא צריכה לשרטט מחדש את המסך.
שאלה 3
מהי הפונקציה של האובייקטים Canvas
, Bitmap
ו-Paint
?
הוספה של משטח ציור דו-ממדי, מפת סיביות שמופיעה במסך, פרטי סגנון לשרטוט.
הוספה של משטח ציור בתלת-ממד, מפת סיביות לשמירת הנתיב, מידע על סגנון לשרטוט.
הוספה של משטח ציור דו-ממדי, מפת סיביות שמופיעה במסך, מעצבים את התצוגה.
הוספה במטמון של פרטי שרטוט, מפת סיביות של שרטוט, עיצוב סגנון לשרטוט.
קישורים למעבדות אחרות של הקוד בקורס הזה זמינים בדף הנחיתה של מכשירי Android מתקדמים בדף Kotlin codelabs.