编辑:我忘了描述我的实际探测:D在方向改变后,肖像 - >横向,反之亦然,拇指布局不正确。我希望布局中间(宽度/ 2)的拇指在方向改变后保持在布局的中间位置。
我正在尝试创建一个“范围滑块”。 我所拥有的是两个简单的视图,代表两个拇指和一个代表滑块的框架布局。
基于滑块的宽度乘以拇指的值(介于0和1之间),我在重写的OnLayout方法中布置了我的两个拇指。
public class RangeSliderView : ViewGroup
{
public RangeSliderView(Context context) : base(context)
{
var thumbL = new Thumb(context);
var thumbR = new Thumb(context);
AddView(thumbL);
AddView(thumbR);
}
protected override void OnLayout(bool changed, int l, int t, int r, int b)
{
if (changed)
{
//Get the width and height if not set yet
if (ThumbLeft.MeasuredWidth == 0 || ThumbLeft.MeasuredHeight == 0)
ThumbLeft.Measure(MeasureSpec.MakeMeasureSpec(0, MeasureSpecMode.Unspecified), MeasureSpec.MakeMeasureSpec(b, MeasureSpecMode.AtMost));
if (ThumbRight.MeasuredWidth == 0 || ThumbRight.MeasuredHeight == 0)
ThumbRight.Measure(MeasureSpec.MakeMeasureSpec(0, MeasureSpecMode.Unspecified), MeasureSpec.MakeMeasureSpec(b, MeasureSpecMode.AtMost));
//calculate width and the relative position of the thumbs
int width = r - l;
int thumbLeftX = (int)(width * lastProgressLeft); //last progresses are a value between 0 and 1
int thumbRightX = (int)(width * lastProgressRight);
//position the thumbs
ThumbLeft.Layout(l: l + thumbLeftX,
t: t,
r: l + thumbLeftX + ThumbLeft.MeasuredWidth,
b: ThumbLeft.MeasuredHeight);
ThumbRight.Layout(l: l + thumbRightX - ThumbRight.MeasuredWidth,
t: t,
r: l + thumbRightX,
b: ThumbLeft.MeasuredHeight);
}
}
}
值似乎是正确的,在景观中,“r”值大于纵向。 “l”始终为0,因为控件与屏幕左侧对齐。计算似乎是正确的,我测试了将其中一个拇指移到中间,所以我可以准确地看到thumbLeftX或thumbRightX是否是宽度的50%。这似乎是正确的。
我认为拇指上的布局(...)调用不能可靠地布置我的拇指。 是否有我错过的布局调用? 我是否需要调用其他方法来正确地重新布置我的拇指?
最初,lastProgressLeft为0,lastProgressRight为1(意味着拇指左侧应位于滑块的左端,右侧拇指位于滑块的右端。这很有效,也适用于方向更改,它看起来很棒正确的。