Android 在视图组(包括其所有子视图)上强制重新布局

Android 在视图组(包括其所有子视图)上强制重新布局,android,android-layout,android-view,Android,Android Layout,Android View,我正在编写一个可以放大的自定义布局(扩展了FrameLayout)。它的所有子视图也是自定义视图,它们实际上通过getter方法从父视图获取比例因子,并通过如下设置缩放尺寸进行相应缩放 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); float scaleFactor = ((

我正在编写一个可以放大的自定义布局(扩展了
FrameLayout
)。它的所有子视图也是自定义视图,它们实际上通过getter方法从父视图获取比例因子,并通过如下设置缩放尺寸进行相应缩放

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

    float scaleFactor = ((CustomLayout) getParent()).getCurrentScale();
    setMeasuredDimension((int) (getMeasuredWidth() * scaleFactor), (int) (getMeasuredHeight() * scaleFactor));
}
我正在使用
scalegestruedetector
检测“收缩到缩放”手势并更改布局的scaleFactor。然后我通过调用
requestLayout
在自定义布局上强制布局。不幸的是,这似乎对孩子们没有任何影响。即使父对象经历了度量和布局周期,也不会调用子对象的
onMeasure
onLayout
。但是,如果我直接调用其中一个子项上的
requestLayout
,只会根据父项中设置的比例因子对该子项进行缩放

似乎除非对视图专门调用
requestLayout
,否则它实际上不会再次测量自身,而是使用某种缓存。这从view的源代码中可以明显看出

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
时再次测量自己?

这将强制重新显示视图的子视图(假定视图自身的宽度和高度不需要更改)

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