Junior
გიცნობთ Android-ის View-ის ციკლს?
sobes.tech AI
პასუხი AI-სგან
ඔව්, මට හුරුයි:
දර්ශනයේ ජීවන චක්රය කිහිපයක් මූලික අදියරවලින් සමන්විත වේ:
- මාපක (Measurement): දර්ශනයේ සහ එහි දරුවන්ගේ ප්රමාණය නියම කරයි. එය පියවර දෙකකින් සිදු වේ:
measure(int widthMeasureSpec, int heightMeasureSpec): මාපකය සිදු කරයි.onMeasure(int widthMeasureSpec, int heightMeasureSpec): මාපක තර්කය ක්රියාත්මක කිරීමට අධිකාරිය අලුත් කරයි.
- සැලසුම් (Layout): දර්ශනයේ සහ එහි දරුවන්ගේ තැන තීරණය කරයි. එක පියවරක් තුළ සිදු වේ:
layout(int l, int t, int r, int b): තැන සැකසීම.onLayout(boolean changed, int l, int t, int r, int b): සැලසුම් තර්කය ක්රියාත්මක කිරීමට අලුත් කරයි.
- ඇඳීම (Drawing): Canvas මත දර්ශනය සහ එහි දරුවන් ඇඳේ. එක පියවරක් තුළ සිදු වේ:
draw(Canvas canvas): ඇඳීම සිදු කරයි.onDraw(Canvas canvas): ඇඳීමේ තර්කය ක්රියාත්මක කිරීමට අලුත් කරයි.
- සම්බන්ධ කිරීම/වෙන් කිරීම (Attach/Detach): දර්ශනය කවුළුවට සම්බන්ධද නැතහොත් නොවේද යන්න පෙන්වයි.
onAttachedToWindow(): සම්බන්ධ කිරීමේදී කැඳවයි.onDetachedFromWindow(): වෙන් කිරීමේදී කැඳවයි.
ජීවන චක්රය තුළ, නැවත මාපක කිරීම (requestLayout()) හෝ නැවත ඇඳීම (invalidate()) ඉල්ලීම් සිදු විය හැකිය, එමඟින් අදියර නැවත සිදු වේ.
අභිරුචික දර්ශන සඳහා, සාමාන්යයෙන් onMeasure, onLayout සහ onDraw ක්රමයන් අලුත් කරයි.
මූලික ක්රමයන් වගුව:
| අදියර | මාපක කිරීමේ ක්රමය | සැලසුම් කිරීමේ ක්රමය | ඇඳීමේ ක්රමය | සම්බන්ධ/වෙන් කිරීමේ ක්රමය |
|---|---|---|---|---|
| ක්රියාවලිය | measure() |
layout() |
draw() |
|
| අලුත් කිරීම | onMeasure() |
onLayout() |
onDraw() |
onAttachedToWindow(), onDetachedFromWindow() |
onMeasure අභිරුචිකරණ උදාහරණයක්:
// අභිරුචික දර්ශනයක
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// මාපක තත්ත්වය සහ ප්රමාණ ලබාගන්න
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int desiredWidth = 100; // කැමති පළල
int desiredHeight = 100; // කැමති උස
int width;
int height;
// විවිධ තත්ත්වයන් සැලසුම් කිරීම
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;
}
// අවසන් ප්රමාණයන් සකසන්න
setMeasuredDimension(width, height);
}