Junior
Vai jūs zināt View dzīves ciklu Android?
sobes.tech AI
Atbilde no AI
Jā, pazīstu.
View dzīves cikls sastāv no vairākiem galvenajiem posmiem:
- Mērīšana (Measurement): Nosaka View un tā bērnu View izmēru. Notiek divos posmos:
measure(int widthMeasureSpec, int heightMeasureSpec): Veic mērīšanu.onMeasure(int widthMeasureSpec, int heightMeasureSpec): Pārdefinēts, lai īstenotu mērīšanas loģiku.
- Izvietošana (Layout): Nosaka View un tā bērnu View pozīciju. Notiek vienā posmā:
layout(int l, int t, int r, int b): Nosaka pozīciju.onLayout(boolean changed, int l, int t, int r, int b): Pārdefinēts, lai īstenotu izvietošanas loģiku.
- Zīmēšana (Drawing): Uzzīmē View un tā bērnu View uz Canvas. Notiek vienā posmā:
draw(Canvas canvas): Veic zīmēšanu.onDraw(Canvas canvas): Pārdefinēts, lai īstenotu zīmēšanas loģiku.
- Pievienošana/Noņemšana (Attach/Detach): Norāda, vai View ir pievienots logam vai no tā atvienots.
onAttachedToWindow(): Izsauc, kad pievienots.onDetachedFromWindow(): Izsauc, kad atvienots.
Dzīves cikla laikā var notikt pieprasījumi pēc atkārtotas mērīšanas (requestLayout()) vai pārkrāsošanas (invalidate()), kas noved pie attiecīgo posmu atkārtotas izpildes.
Īpaši pielāgotajiem View visbiežāk pārdefinē onMeasure, onLayout un onDraw metodes.
Galvenās metodes tabula:
| Posms | Mērīšanas metode | Izvietošanas metode | Zīmēšanas metode | Pievienošanas/Noņemšanas metode |
|---|---|---|---|---|
| Process | measure() |
layout() |
draw() |
|
| Pārdefinēšana | onMeasure() |
onLayout() |
onDraw() |
onAttachedToWindow(), onDetachedFromWindow() |
Piemērs, kā pārdefinēt onMeasure pielāgotā View:
// Pielāgotā View
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// Saņem mērīšanas režīmu un izmēru
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int desiredWidth = 100; // Vēlamais View platums
int desiredHeight = 100; // Vēlamais View augstums
int width;
int height;
// Apstrādā dažādus mērīšanas režīmus
if (widthMode == MeasureSpec.EXACTLY) {
width = widthSize;
} else if (widthMode == MeasureSpec.AT_MOST) {
width = Math.min(desiredWidth, widthSize);
} else { // MeasureSpec.UNSPECIFIED
width = desiredWidth;
}
if (heightMode == MeasureSpec.EXACTLY) {
height = heightSize;
} else if (heightMode == MeasureSpec.AT_MOST) {
height = Math.min(desiredHeight, heightSize);
} else { // MeasureSpec.UNSPECIFIED
height = desiredHeight;
}
// Iestata galīgos izmērus
setMeasuredDimension(width, height);
}