2014-09-24 16 views
5

Sto scrivendo un layout personalizzato (che si estende FrameLayout) che può essere ingrandito. Tutti i suoi figli sono anche viste personalizzate che potrebbero effettivamente ottenere il fattore di scala dal loro genitore tramite un metodo getter e la scala di conseguenza, impostando le dimensioni in scala comeModifica forzata su un gruppo di visualizzazione compresi tutti i suoi figli

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

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

sto usando un ScaleGestureDetector per rilevare il "pinch to zoom" gesto e cambiare scaleFactor del layout. Quindi imposto un layout sul layout personalizzato chiamando lo requestLayout. Sfortunatamente questo non sembra avere alcun effetto sui suoi figli. I bambini onMeasure & onLayout non vengono mai chiamati anche se il genitore passa attraverso il suo ciclo di misura &. Ma, se chiamassi direttamente requestLayout su uno dei bambini, solo quel bambino viene ridimensionato in base al fattore di scala impostato nel genitore !!

Sembra che a meno che requestLayout non venga chiamato esclusivamente su una vista, in realtà non si misura di nuovo e invece utilizza un qualche tipo di cache. Questo è evidente dal codice sorgente per la vista che dice

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

Come forzo i bambini anche andare misurarsi di nuovo a chiamare requestLayout sul loro genitore?

risposta

4

Questo costringerà Ridefinisci layout figli della vista (dato proprio larghezza e l'altezza di quella vista non ha bisogno di cambiare)

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()); 
} 
Problemi correlati