2014-09-24 5 views
5

मैं एक कस्टम लेआउट लिख रहा हूं (जो 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 बुला पर फिर से खुद को मापने के जाने के लिए करते हैं कहते हैं देखने के लिए स्रोत कोड से स्पष्ट है?

उत्तर

4

यह दृश्य के बच्चों relayout बाध्य करेगा (उस दृश्य की अपनी चौड़ाई और ऊंचाई दिया बदलने की जरूरत नहीं है)

private static void relayoutChildren(View view) { 
    view.measure(
     View.MeasureSpec.makeMeasureSpec(view.getMeasuredWidth(), View.MeasureSpec.EXACTLY), 
     View.MeasureSpec.makeMeasureSpec(view.getMeasuredHeight(), View.MeasureSpec.EXACTLY)); 
    view.layout(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()); 
} 
संबंधित मुद्दे