2014-09-24 17 views
5

Yakınlaştırılabilen özel bir düzen (FrameLayout'u genişletiyor) yazıyor. Tüm çocukları da, ölçek faktörünü ebeveynlerinden almasını sağlayan özel görünümler içeriyor. bir alıcı yöntemi ve Jestin "yakınlaştırmak için tutam" ve Düzenin ScaleFactor değiştirmek algılamak için bir ScaleGestureDetector kullanıyorumTüm çocukları da dahil olmak üzere bir görünüm grubuna yeniden yerleştirme zorlaması

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

    float scaleFactor = ((CustomLayout) getParent()).getCurrentScale(); 
    setMeasuredDimension((int) (getMeasuredWidth() * scaleFactor), (int) (getMeasuredHeight() * scaleFactor)); 
} 

gibi ölçekli boyutları ayarlayarak ölçeğiyle. Ardından, requestLayout numaralı telefonu arayarak özel düzende bir düzen zorlar. Ne yazık ki, bunun çocukları üzerinde herhangi bir etkisi yoktur. Ebeveyn ölçüsü & mizanpaj döngüsünden geçmesine rağmen, onMeasure & onLayout numaralı çocuklara hiçbir zaman çağrılmaz. Ancak, çocuklardan birine doğrudan requestLayout numaralı telefonu arayacak olursam, o çocuk yalnızca ebeveynte ayarlanan ölçek faktörüne göre ölçeklenir!

Görünüşe göre, requestLayout yalnızca bir görünüme çağrılmadıkça, aslında kendini yeniden ölçmez ve bunun yerine bir çeşit önbellek kullanır. Bu

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; 
    } 

nasıl onların ebeveyn üzerinde requestLayout arayarak tekrar kendilerini ölçmek gitmek için de çocukları zorlamak diyor görünümü için kaynak kodundan bellidir?

cevap

4

Bu

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()); 
} 
(değiştirmek gerekmez, o görünümün kendi genişliği ve yüksekliği verilen) görünümün çocukları relayout zorlar
İlgili konular