木骰

UGUI:关于ScrollRect在Clamped模式下 限制Content在滑动范围内

有时候做一个ScrollRect的定位功能,给Content赋位置坐标的会导致Content超出了ScrollRect的滑动范围.

像这样:

如果ScrollRect选择Elastic模式的话会自动把Content拉回来,但是选择Clamped就不会了。那就需要在给Content赋值的时候就先把目标坐标规范在滑动范围内。

Content在起始位置时的坐标刚好为0.所以最小坐标就是0。
最大坐标为Content尺寸的宽或高 再减去 一屏的滑动区域尺寸。 滑动一个Content尺寸的高或宽刚好完全出了滑动区域。

往回拉一屏的滑动区域尺寸 即ScrollRect的尺寸,

所以最大坐标就是 Content尺寸减去滑动区域尺寸。

content.sizeDelta.y-scroll.sizeDelta.y。

- (content.sizeDelta.x-scroll.sizeDelta.x) 因为横向是往左(x递减)的方向滑的,所以最大坐标其实是最小坐标。而最小坐标0才是最大坐标。

计算了目标坐标后,再限制在最小坐标和最大坐标之内就可以了。可以用Mathf.Clamp();函数。

下边是我用用来定位Content下某一个Item的代码


Vector2pos = (grid_tabs.transformasRectTransform).anchoredPosition;
pos.y = (tabs[index] as RectTransform ).anchoredPosition.y*-1-((tabs[index].transform as RectTransform).sizeDelta.y/2f);
float proccess= 1 - (pos.y / ( (grid_tabs.transforms asRectTransform ) .sizeDelta.y- (scroll_tabs.transform as RectTransform).sizeDelta.y));
proccess = Mathf.Clamp(proccess, 0, 1);
scroll_tabs.verticalNormalizedPosition = proccess;

因为Item的中心点设为了0.5,所以目标坐标还要减去item尺寸的一半。
用了scrollRect.verticalNotmalizedPosition,完全是当时想多了。这个变量的值是个0到1之间的值, 1在起始位置,0则在末尾。根据最大坐标算了一个比例值。其实完全不用这样。直接规范坐标后赋值就好了。

注意 给Content赋值的时候不要给localPosition赋值,应该给anchorPosition赋值。 UGUI里一切关于坐标的计算都应该首先考虑用anchorPosition。

— 于 共写了1133个字
— 文内使用到的标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*