5
我正在编写一个可以放大的自定义布局(它扩展了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));
}
按比例调整我使用的是ScaleGestureDetector
检测“指缩放”手势,并改变布局的比例因子。然后我通过调用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
再次去衡量自己是显而易见的?