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);
}