2011-12-20 54 views
4

我有一个扩展RelativeLayout,当它使用RelativeLayout.LayoutParams进行编程定位和大小时,需要将其自身限制为给定的宽高比。通常情况下,我会愿意为它本身限制为1:1,因此,如果RelativeLayout.LayoutParams包含200 width和100 height,自定义RelativeLayout将自身限制到100×100覆盖RelativeLayout的onMeasure()以限制其长宽比

我已经使用在普通定制View中重写onMeasure()以实现类似的目标。例如,我创建了自己的SVG图像转换器,并且呈现SVG图像的自定义View覆盖了onMeasure(),可确保对setMeasuredDimension()的调用包含(a)符合原始测量规范的尺寸,以及(b)匹配原始SVG图像的宽高比。

回到我的自定义RelativeLayout,我想以类似的方式限制自己,我试图覆盖onMeasure(),但我没有取得太大的成功。知道RelativeLayoutonMeasure()执行所有儿童View安置,我目前通常要做的事情,但没有期望的结果,是覆盖onMeasure(),使我最初修改尺寸规格(即应用我所需的约束条件),然后致电super.onMeasure()。就像这样:

@Override 
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec){ 

    int widthMode = MeasureSpec.getMode(widthMeasureSpec); 
    int widthSize = MeasureSpec.getSize(widthMeasureSpec);  
    int heightMode = MeasureSpec.getMode(heightMeasureSpec); 
    int heightSize = MeasureSpec.getSize(heightMeasureSpec); 

    // Restrict the aspect ratio to 1:1, fitting within original specified dimensions 
    int chosenDimension = Math.min(chosenWidth, chosenHeight); 
    widthMeasureSpec = MeasureSpec.makeMeasureSpec(chosenDimension, MeasureSpec.AT_MOST); 
    heightMeasureSpec = MeasureSpec.makeMeasureSpec(chosenDimension, MeasureSpec.AT_MOST); 

    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
} 

什么实际上当我做到这一点的是,奇怪的是,高度正确限制,因为我打算,但宽度不发生。为了说明:

  • 指定的200在RelativeLayout.LayoutParams结果的高度和宽度100在我的自定义RelativeLayout具有100的高度和宽度100 - >正确。

  • RelativeLayout.LayoutParams中指定100的高度和200的宽度会导致我的自定义RelativeLayout高度为100,宽度为200. - >不正确。

我意识到,我可以代替多数民众赞成放置RelativeLayout在首位(在此期间,我可能做的来解决这个问题)调用的类内申请我的长宽比约束逻辑,但实际上这是我希望RelativeLayout本身执行的实现细节。

澄清:将所得的宽度和高度值我读回从使用getWidth()getHeight()。在布局过程再次执行后,这些值将在未来某个时间回读。

回答

17

我已经解决这个现在还设置width,目前由RelativeLayoutonMeasure()举行的LayoutParamsheight了。

@Override 
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec){ 

    int widthSize = MeasureSpec.getSize(widthMeasureSpec);  
    int heightSize = MeasureSpec.getSize(heightMeasureSpec); 

    // Restrict the aspect ratio to 1:1, fitting within original specified dimensions 
    int chosenDimension = Math.min(widthSize, heightSize); 
    widthMeasureSpec = MeasureSpec.makeMeasureSpec(chosenDimension, MeasureSpec.AT_MOST); 
    heightMeasureSpec = MeasureSpec.makeMeasureSpec(chosenDimension, MeasureSpec.AT_MOST); 

    getLayoutParams().height = chosenDimension; 
    getLayoutParams().width = chosenDimension; 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
    } 

这现在作为期望:在RelativeLayout的大小(和getWidth()getHeight()后续调用)现在,在我的重写onMeasure()应用大小限制达成一致。

+2

谢谢!这对我非常有帮助。 – 2012-03-14 03:20:18