2014-09-24 68 views
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再次去衡量自己是显而易见的?

回答

4

这将迫使重新布局视图的孩子(因为观点本身的宽度和高度并不需要改变)

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()); 
} 
相关问题