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)(inRowScopeorColumnScope) 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.
- מאפיינים שעודכנו ב-Lambda:
Modifier.drawBehind { ... }:- מצייר פקודות של Canvas מאחורי התוכן שניתן להרכבה.
Modifier.drawWithContent { ... }:- שולט בסדר הציור באמצעות
drawContent().
- שולט בסדר הציור באמצעות
Modifier.drawWithCache { ... }:- הבלוק החיצוני פועל כשמשנים את הגודל או הפריסה כדי לשמור במטמון אובייקטים של
Path,PaintאוBrush. הבלוקיםonDrawBehindאוonDrawWithContentפועלים בכל ציור של פריים.
- הבלוק החיצוני פועל כשמשנים את הגודל או הפריסה כדי לשמור במטמון אובייקטים של
מחוץ ללולאת הרה-קומפוזיציה – שינויי התנהגות
חלק מהמשנים פועלים מחוץ לשלושת השלבים של המסגרת כדי לטפל בנגישות, בקלט של המשתמשים ובמעקב אחר מחזור החיים.
סמנטיקה ונגישות
מעבד מאפיינים סמנטיים לשירותי נגישות (TalkBack) ולבדיקות:
Modifier.semantics { ... }Modifier.clearAndSetSemantics { ... }
קלט, תנועות ואירועים
הוא פועל מחוץ לצינור העיבוד של שלוש הפאזות, ומקבל אירועי תנועה של מערכת ההפעלה ואינטראקציות של המשתמש:
Modifier.pointerInput(key) { detectTapGestures { ... } }/detectDragGestures/awaitPointerEventScopeModifier.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) |