2011-12-28 29 views
54

Android Documentation says कि दृश्य के लिए दो आकार हैं, मापा आयाम और ड्राइंग आयाम। मापा आयाम माप (onMeasure विधि) में गणना की गई है, जबकि ड्राइंग आयाम स्क्रीन पर वास्तविक आकार हैं। विशेष रूप से, दस्तावेज़ीकरण कहता है कि:एंड्रॉइड एसडीके में getWidth/Height() और getMeasuredWidth/Height() के बीच क्या अंतर है?

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

तो, मेरा प्रश्न है: ड्राइंग आयाम मापित आयाम से अलग कैसे हो सकता है? onMeasure(int,int) विधि लेआउट आवश्यकताओं का सम्मान करता है, तो (पैरामीटर widthMeasureSpec और heightMeasureSpec, कैसे कर सकता है एसडीके फैसला करता है कि देखने के लिए एक अलग ड्राइंग आकार होना चाहिए?

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

+0

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

+0

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

+0

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

उत्तर

68

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

मुझे एक उदाहरण देता हूँ,

एक विजेट खुद को मापने के लिए कहा जाता है, विजेट का कहना है कि यह 200px 200px द्वारा बनना चाहता है। यह मापा गया है चौड़ाई/ऊंचाई।

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

कहता है कि ऑनलाइट विधि childview.layout (0,0,150,150) कहती है अब दृश्य की चौड़ाई/ऊंचाई मापा चौड़ाई/ऊंचाई से अलग है।

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

सारांशित करने के लिए।

  1. onMeasure -> सेट measuredWidth/measuredHeight
  2. onLayout -> विजेट के चौड़ाई/ऊंचाई सेट करता है।

additionallly
public void View.layout(int l, int t, int r, int b)
जगह जहां स्थिति और आकार का काम होता रहा है।

+0

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

+0

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

+0

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