我正在创建一个扩展LinearLayout
的自定义视图。我正在为线性布局添加一些形状,目前它们之间具有固定的空间值。我这样做是通过定义LayoutParams
并设置边距来创建形状之间的空间。
我想要做的是将它们跨越整个屏幕的相等空间,以便填充它,但前提是视图的宽度设置为match_parent
或fill_parent
。如果设置为wrap_content
,则应设置原始的固定空间值。
我尝试过:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
spaceBetweenShapesPixels = (parentWidth - shapeWidth * numberOfShapes) / numberOfShapess;
}
但是,该方法似乎被调用了两次 - 一次是父级的宽度和高度,一次是View的本身,一次是视图本身,空间得到0值。
那我怎么才能做出这样的逻辑:
if(width is wrap_content)
{
space = 10;
}
else
{
space = (parentWidth - shapeWidth * numberOfShapes) / numberOfShapess;
}
答案 0 :(得分:0)
您应该使用WidthMode
和HeightMode
在onMeasure()
方法中。以下是我的一个项目的样本
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int measuredWidth = 0, measuredHeight = 0;
if (widthMode == MeasureSpec.EXACTLY || widthMode == MeasureSpec.AT_MOST) {
measuredWidth = MeasureSpec.getSize(widthMeasureSpec);
}
if (heightMode == MeasureSpec.EXACTLY) {
measuredHeight = MeasureSpec.getSize(heightMeasureSpec);
} else if (heightMode == MeasureSpec.AT_MOST) {
double height = MeasureSpec.getSize(heightMeasureSpec) * 0.8;
measuredHeight = (int) height;// + paddingTop + paddingBottom;
}
}
MeasureSpec.EXACTLY
- 视图应该是这么多像素,无论它实际上有多大。
MeasureSpec.AT_MOST
- 如果视图的尺寸较小,则视图可以是此尺寸或更小。
MeasureSpec.UNSPECIFIED
- 视图可以是它需要的任何大小,以显示它需要显示的内容。