פירוט של שינויים לפי שלב

‫Jetpack Compose מפעיל את שינויי המאפיינים בשלבים נפרדים. בפירוט הבא מוסבר לאיזה שלב שייכים משנים נפוצים ומתי מתבצעת ההערכה של הארגומנטים או של ביטויי הלמדה שלהם.

שלב 1: שלב ההלחנה

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

  • מאפיינים סטטיים ומשנים של גודל:
    • Modifier.size(dp), Modifier.width(dp), Modifier.height(dp)
    • Modifier.fillMaxSize(), Modifier.fillMaxWidth(), Modifier.fillMaxHeight()
    • Modifier.wrapContentSize(), Modifier.wrapContentWidth(), Modifier.wrapContentHeight()
    • Modifier.requiredSize(), Modifier.defaultMinSize()
    • Modifier.aspectRatio(ratio)
    • ‫Modifier.weight(weight) (in RowScope or ColumnScope)
    • Modifier.width(IntrinsicSize.Min / Max)
    • Modifier.height(IntrinsicSize.Min / Max)
  • Static Spacing & Insets:
    • Modifier.padding(all = dp), Modifier.padding(start, top, end, bottom)
    • Modifier.windowInsetsPadding(insets), Modifier.statusBarsPadding()
  • שינויים חזותיים של ערכים ישירים:
    • Modifier.alpha(float) (קורא את המצב במהלך הכתיבה)
    • Modifier.rotate(degrees) (קורא את המצב במהלך הכתיבה)
    • Modifier.scale(scaleX, scaleY) (קורא את המצב במהלך הכתיבה)
    • Modifier.background(color = Color, shape = Shape)
    • Modifier.border(width, color, shape)
    • Modifier.shadow(elevation, shape)
    • Modifier.clip(shape)
    • Modifier.blur(radius)
  • משני מיקום סטטיים:
    • Modifier.offset(x = dp, y = dp) (העמסת ערך ישיר)
    • Modifier.absoluteOffset(x = dp, y = dp)
  • Dynamic Composable Modifiers:
    • ‫Modifier.composed { ... } (הפונקציה פועלת במהלך ההרכבה)

שלב 2: שלב הפריסה

שלב הפריסה מחולק לשני שלבי משנה נפרדים עם היקפי ביטול תוקף נפרדים:

שלב 2א: מדידה

קובע את הגודל (width, height) ואת המגבלות. הסטטוס שנקרא כאן מפעיל מדידה מחדש ומיקום מחדש:

  • ‫Modifier.layout { measurable, constraints -> ... }: הקוד לפני layout(w, h) מופעל במהלך המדידה.

שלב 2ב: קריאות חוזרות (callback) למיקום ולפריסה

קובע את מיקום הקואורדינטות של (x, y). קריאת המצב כאן מפעילה מיקום מחדש בלבד (דילוג על מדידה והרכב):

  • ‫Modifier.offset { IntOffset(x, y) } (lambda overload)
  • ‫Modifier.absoluteOffset { IntOffset(x, y) } (lambda overload)
  • ‫Modifier.layout { ... layout(w, h) { placeable.place(x, y) } }: קוד בתוך בלוק layout(w, h) { ... }.
  • ‫Modifier.onPlaced { layoutCoordinates -> ... }: מופעל אחרי שנקבעים הקואורדינטות של הרכיב ההורה במהלך המיקום.
  • ‫Modifier.onSizeChanged { intSize -> ... }: מופעל אחרי שמדידת הפריסה מסתיימת אם הגודל השתנה.
  • ‫Modifier.onGloballyPositioned { layoutCoordinates -> ... }: מופעל אחרי שכל תהליך הפריסה של חלון מסתיים.

שלב 3: שלב הציור

השינויים האלה מתבצעים במהלך השרטוט בלוח הציור. קריאת מצב בתוך הבלוקים האלה מדלגת על גם על Composition וגם על Layout, ומריצה רק את שלב הציור:

  • Modifier.graphicsLayer { ... }:
    • מאפיינים שעודכנו ב-Lambda: alpha, translationX, translationY, scaleX, scaleY, rotationX, rotationY, rotationZ, shadowElevation, shape, clip, renderEffect, transformOrigin.
  • Modifier.drawBehind { ... }:
    • מצייר פקודות של Canvas מאחורי התוכן שניתן להרכבה.
  • Modifier.drawWithContent { ... }:
    • שולט בסדר הציור באמצעות drawContent().
  • Modifier.drawWithCache { ... }:
    • הבלוק החיצוני פועל כשמשנים את הגודל או הפריסה כדי לשמור במטמון אובייקטים של Path, Paint או Brush. הבלוקים onDrawBehind או onDrawWithContent פועלים בכל ציור של פריים.

מחוץ ללולאת הרה-קומפוזיציה – שינויי התנהגות

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

סמנטיקה ונגישות

מעבד מאפיינים סמנטיים לשירותי נגישות (TalkBack) ולבדיקות:

  • Modifier.semantics { ... }
  • Modifier.clearAndSetSemantics { ... }

קלט, תנועות ואירועים

הוא פועל מחוץ לצינור העיבוד של שלוש הפאזות, ומקבל אירועי תנועה של מערכת ההפעלה ואינטראקציות של המשתמש:

  • Modifier.pointerInput(key) { detectTapGestures { ... } } / detectDragGestures / awaitPointerEventScope
  • Modifier.clickable(enabled, onClickLabel) { ... }
  • Modifier.combinedClickable { ... }
  • Modifier.toggleable { ... }
  • Modifier.selectable { ... }
  • Modifier.draggable(...) / Modifier.scrollable(...) / Modifier.draggable2D(...)
  • Modifier.onFocusChanged { focusState -> ... }
  • Modifier.onKeyEvent { keyEvent -> ... }
  • ‫Modifier.onVisibilityChanged { isVisible -> ... }: הקריאה החוזרת מופעלת כשסטטוס החשיפה של רכיב שאפשר להרכיב משתנה אחרי השהיה שהוגדרה, בתוך קורוטינה.

קישור למאמר עזרה: ערך לעומת שלב Lambda

קריאת ערך של מצב בהגדרת lambda דוחה את הקריאה לשלב מאוחר יותר, וכשהמצב הזה משתנה, השלבים הקודמים נדלגים:

Modifier / Pattern ערך ישיר (הרכב) Lambda Variant (Deferred Phase) כשמצב משתנה
הזחה Modifier.offset(x, y) Modifier.offset { IntOffset(x, y) } פריסה (מיקום) (דילוג על יצירת קומפוזיציה)
אלפא / אטימות Modifier.alpha(alpha) Modifier.graphicsLayer { this.alpha = alpha } ציור (דילוג על יצירה ופריסה)
סיבוב Modifier.rotate(degrees) Modifier.graphicsLayer { rotationZ = degrees } ציור (דילוג על יצירה ופריסה)
שינוי גודל Modifier.scale(scale) Modifier.graphicsLayer { scaleX = s; scaleY = s } ציור (דילוג על יצירה ופריסה)
תרגום Modifier.padding(...) Modifier.graphicsLayer { translationX = ... } ציור (דילוג על יצירה ופריסה)
צבע רקע Modifier.background(color) Modifier.drawBehind { drawRect(color) } ציור (דילוג על יצירה ופריסה)
גלילה / פרלקס Modifier.offset(scroll.dp) Modifier.offset { IntOffset(0, scroll) } פריסה (מיקום) (דילוג על יצירת קומפוזיציה)

מיפוי של ממשק Modifier.Node

עבור שינויים בהתאמה אישית באמצעות Modifier.Node API עם ביצועים גבוהים, השלבים ממופים ישירות לממשקי יכולות של צמתים:

שלב Modifier.Node ממשק Core Methods
פריסה (מדידה ומיקום) LayoutModifierNode measure(measurable, constraints)
פריסה (קואורדינטות גלובליות) GlobalPositionAwareModifierNode onGloballyPositioned(coordinates)
פריסה (מיקום מודעה) LayoutAwareModifierNode onRemeasured(size), onPlaced(coordinates)
ציור DrawModifierNode draw(ContentDrawScope)
קלט / מצביע PointerInputModifierNode onPointerEvent(...), onCancelPointerInput()
סמנטיקה SemanticsModifierNode applySemantics(SemanticsPropertyReceiver)
התמקדות FocusEventModifierNode onFocusEvent(focusState)