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?