Android SDK में getWidth / Height () और getMeasuredWidth / Height () के बीच क्या अंतर है?


91

एंड्रॉयड प्रलेखन का कहना है एक दृश्य, के लिए दो आकारों है कि वहाँ मापा आयामों और ड्राइंग आयाम । मापा आयाम माप पास ( ऑनमैर विधि) में गणना की गई है , जबकि ड्राइंग आयाम स्क्रीन पर वास्तविक आकार हैं। विशेष रूप से, प्रलेखन कहता है कि:

ये मान हो सकते हैं, लेकिन मापी गई चौड़ाई और ऊंचाई से भिन्न नहीं हैं।

तो, मेरा सवाल यह है: क्या आरेखित आयाम मापा आयाम से भिन्न हो सकते हैं? यदि onMeasure (int, int) विधि लेआउट आवश्यकताओं का सम्मान करती है (पैरामीटर चौड़ाई के रूप में दिया जाता है ।MeasureSpec और heightMeasureSpec , तो SDK कैसे तय कर सकता है कि दृश्य का एक अलग ड्राइंग आकार होना चाहिए?

इसके अतिरिक्त, एंड्रॉइड सोर्स कोड में कैसे / कहां मापा चौड़ाई / ऊंचाई ड्राइंग की चौड़ाई / ऊंचाई की गणना करने के लिए उपयोग की जाती है? मैंने स्रोत कोड देखने की कोशिश की , लेकिन मैं यह नहीं पता लगा सकता कि अंतिम चौड़ाई / ऊंचाई की गणना करने के लिए कैसे मापा जाता है। हो सकता है कि इसका पेडिंग के साथ कुछ करना है, लेकिन मुझे यकीन नहीं है।


मुझे लगता है कि अगर दृश्य में एक स्क्रॉल जोड़ा जाता है तो ये उपाय अलग-अलग हो सकते हैं।
सूर्योदय

हो सकता है, लेकिन मैंने एक कस्टम व्यूग्रुप विकसित किया है, और यह मेरे कोड में हो रहा है। मैं उस बिंदु तक स्क्रॉल के साथ काम नहीं कर रहा हूं जहां यह व्यवहार होता है। इसलिए मुझे लगता है कि इसमें स्क्रॉल से अधिक शामिल होना चाहिए।
lgfischer

मैं पुष्टि करता हूं, मैं एक कस्टम व्यूग्रुप को भी एक निश्चित पहलू-अनुपात के लिए बाध्य करता हूं: मैंने मापा चौड़ाई और ऊंचाई (कम या बराबर तब प्रस्तावित) को मजबूर किया, लेकिन मेरे पास परिणाम के रूप में वास्तविक चौड़ाई और ऊंचाई नहीं बदली गई थी (न कि मापा वाले)। स्क्रॉल से कोई संबंध नहीं। मैं वास्तव में वास्तविक चौड़ाई और ऊंचाई को मजबूर करने का कोई तरीका नहीं खोज सकता।
ARLabs

जवाबों:


101

जैसा कि नाम से पता चलता है कि मापने और लेआउटिंग चरण के दौरान मापी ऊंचाई / ऊंचाई का उपयोग किया जाता है।

मुझे एक उदाहरण देने दें,

एक विजेट को खुद को मापने के लिए कहा जाता है, विजेट कहता है कि यह 200px से 200px होना चाहता है। यह मापा जाता है / ऊंचाई।

लेआउट चरण के दौरान, अर्थात् ऑन-लाईट विधि में। विधि अपने बच्चों के मापा / ऊंचाई का उपयोग कर सकती है या दृश्य की लेआउट पद्धति को कॉल करके एक नई चौड़ाई / ऊंचाई निर्दिष्ट कर सकती है।

चलो कहता है कि onLayout मेथड childview.layout (0,0,150,150) कहता है, अब दृश्य की चौड़ाई / ऊंचाई मापा चौड़ाई / ऊंचाई से भिन्न है।

मेरा सुझाव है कि onLayout पद्धति के बाहर मापा गया / ऊंचाई का उपयोग न करें।

संक्षेप में ।

  1. onMeasure -> मापित / मापा जाता है
  2. onLayout -> विजेट की चौड़ाई / ऊँचाई सेट करता है।

अतिरिक्त
public void View.layout(int l, int t, int r, int b)
रूप से वह स्थान प्रतीत होता है जहाँ स्थिति और आकार का कार्य होता है।


यह है, हम हमेशा एक दृश्य के "वास्तविक" आयाम प्राप्त करने के लिए getWidth / getHeight का उपयोग करना चाहिए, है ना?
सुतानीषी

1
हां, लेकिन अगर आप अपनी खुद की लेआउटिंग कर रहे हैं तो आपको चौड़ाई के बजाय मेजरमेंट का उपयोग करना चाहिए।
प्रकाश नादर

तो, onMeasure () के अंदर dimesions सेट करने का उद्देश्य क्या है? मेरा मतलब है, लेआउट पास अंतिम एक है, जिसमें आप दृश्य के अंतिम आयाम सेट करते हैं, मापा आयामों की परवाह किए बिना
प्रतिपूर्ति

@edoardotognoni यह लेआउट (LinearLayout, RelativeLayout या आपके कस्टम लेआउट) पर निर्भर करता है, ताकि दृश्य को सही आकार और स्थिति दी जा सके।
प्रकाश नादर

ठीक है, चलो कहते हैं कि दृश्य बताता है "मुझे ये आयाम पसंद हैं"। जबकि लेआउट कहता है "आपके पास ये आयाम होंगे"। क्या यह सही है?
एडोआर्डोटोनोनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.