onMeasure()
एंड्रॉइड को यह बताने का आपका अवसर है कि आप कितना बड़ा चाहते हैं कि आपका कस्टम दृश्य माता-पिता द्वारा प्रदान की गई लेआउट बाधाओं पर निर्भर हो; यह आपके कस्टम व्यू का अवसर भी है कि उन लेआउट बाधाओं को जानने का अवसर क्या है (यदि आप किसी match_parent
स्थिति से अलग स्थिति में व्यवहार करना चाहते हैं wrap_content
)। इन बाधाओं को MeasureSpec
विधि में पारित किए गए मानों में पैक किया जाता है । यहाँ मोड मूल्यों का एक मोटा सहसंबंध है:
- वास्तव में इसका मतलब है
layout_width
या layout_height
मान एक विशिष्ट मूल्य पर सेट किया गया था। आपको शायद इस आकार को अपना विचार बनाना चाहिए। इसका match_parent
उपयोग तब भी किया जा सकता है जब इसका उपयोग किया जाता है, आकार को मूल दृश्य में सेट करने के लिए (यह लेआउट में आश्रित है)।
- आमतौर पर AT_MOST का अर्थ है कि
layout_width
या वह layout_height
मान सेट किया गया था match_parent
या wrap_content
जहां अधिकतम आकार की आवश्यकता है (यह फ्रेमवर्क में लेआउट पर निर्भर है), और मूल आयाम का आकार मान है। आपको इस आकार से बड़ा नहीं होना चाहिए।
- UNSPECIFIED का अर्थ आमतौर पर होता है
layout_width
या layout_height
मान wrap_content
बिना किसी प्रतिबंध के सेट किया गया था । आप जो चाहें आकार हो सकते हैं। कुछ लेआउट भी इस कॉलबैक का उपयोग आपके वांछित आकार का पता लगाने से पहले करते हैं कि वास्तव में दूसरे माप अनुरोध में आपको फिर से पास करने के लिए क्या चश्मा है।
इसके साथ मौजूद अनुबंध यह onMeasure()
है कि जिस आकार को आप देखना चाहते हैं, उसके आकार के साथ अंत में setMeasuredDimension()
MUST को बुलाया जाना चाहिए। इस पद्धति को सभी फ्रेमवर्क कार्यान्वयनों द्वारा बुलाया जाता है, जिसमें पाया गया डिफ़ॉल्ट कार्यान्वयन भी शामिल है View
, यही कारण है कि इसके super
उपयोग के मामले में फिट होने के बजाय कॉल करना सुरक्षित है ।
दी गई, क्योंकि रूपरेखा एक डिफ़ॉल्ट कार्यान्वयन को लागू करती है, इसलिए आपके लिए इस पद्धति को ओवरराइड करना आवश्यक नहीं हो सकता है, लेकिन आप उन मामलों में कतरन देख सकते हैं, जहाँ आप नहीं देखते हैं, तो दृश्य स्थान आपकी सामग्री से छोटा है, और यदि आप अपना काम करते हैं wrap_content
दोनों दिशाओं में कस्टम दृश्य , आपका दृश्य बिल्कुल भी नहीं दिख सकता क्योंकि फ्रेमवर्क यह नहीं जानता कि यह कितना बड़ा है!
आम तौर पर, यदि आप View
किसी अन्य मौजूदा विजेट को ओवरराइड कर रहे हैं और नहीं, तो यह कार्यान्वयन प्रदान करने के लिए एक अच्छा विचार है, भले ही यह कुछ इस तरह से सरल हो:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int desiredWidth = 100;
int desiredHeight = 100;
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int width;
int height;
//Measure Width
if (widthMode == MeasureSpec.EXACTLY) {
//Must be this size
width = widthSize;
} else if (widthMode == MeasureSpec.AT_MOST) {
//Can't be bigger than...
width = Math.min(desiredWidth, widthSize);
} else {
//Be whatever you want
width = desiredWidth;
}
//Measure Height
if (heightMode == MeasureSpec.EXACTLY) {
//Must be this size
height = heightSize;
} else if (heightMode == MeasureSpec.AT_MOST) {
//Can't be bigger than...
height = Math.min(desiredHeight, heightSize);
} else {
//Be whatever you want
height = desiredHeight;
}
//MUST CALL THIS
setMeasuredDimension(width, height);
}
उम्मीद है की वो मदद करदे।