मैं एक कस्टम लेआउट लिख रहा हूं (जो FrameLayout
बढ़ाता है) जिसे ज़ूम किया जा सकता है। इसके सभी बच्चे भी कस्टम विचार हैं जो वास्तव में उनके माता-पिता से स्केल कारक प्राप्त करेंगे एक गेटर विधि और जैसेअपने सभी बच्चों सहित एक व्यूग्रुप पर बल पुन: लेआउट
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
float scaleFactor = ((CustomLayout) getParent()).getCurrentScale();
setMeasuredDimension((int) (getMeasuredWidth() * scaleFactor), (int) (getMeasuredHeight() * scaleFactor));
}
बढ़ाया आयाम निर्धारित करके तदनुसार पैमाने पर मैं एक ScaleGestureDetector
उपयोग कर रहा हूँ पता लगाने के लिए इशारा "चुटकी ज़ूम करने के लिए" और लेआउट के scaleFactor बदल जाते हैं। फिर मैं requestLayout
पर कॉल करके कस्टम लेआउट पर एक लेआउट को मजबूर करता हूं। दुर्भाग्य से ऐसा लगता है कि यह अपने बच्चों पर कोई प्रभाव नहीं पड़ता है। बच्चों के onMeasure
& onLayout
को कभी भी कॉल नहीं किया जाता है, भले ही माता-पिता & लेआउट चक्र के माध्यम से जाते हैं। लेकिन, अगर मैं सीधे बच्चों में से एक पर requestLayout
पर कॉल करता हूं, तो केवल उस बच्चे को माता-पिता में निर्धारित पैमाने के कारक के अनुसार स्केल किया जाता है !!
ऐसा लगता है कि जब तक requestLayout
को विशेष रूप से एक दृश्य पर नहीं बुलाया जाता है, तो यह वास्तव में खुद को मापने में नहीं आता है और इसके बजाय किसी प्रकार का कैश का उपयोग करता है। यह जो
if (mAttachInfo != null && mAttachInfo.mViewRequestingLayout == null) {
// Only trigger request-during-layout logic if this is the view requesting it,
// not the views in its parent hierarchy
ViewRootImpl viewRoot = getViewRootImpl();
if (viewRoot != null && viewRoot.isInLayout()) {
if (!viewRoot.requestLayoutDuringLayout(this)) {
return;
}
}
mAttachInfo.mViewRequestingLayout = this;
}
मैं कैसे बच्चों को भी मजबूर अपने माता पिता पर requestLayout
बुला पर फिर से खुद को मापने के जाने के लिए करते हैं कहते हैं देखने के लिए स्रोत कोड से स्पष्ट है?