我有一个扩展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()
,但我没有取得太大的成功。知道RelativeLayout
的onMeasure()
执行所有儿童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()
。在布局过程再次执行后,这些值将在未来某个时间回读。
谢谢!这对我非常有帮助。 – 2012-03-14 03:20:18