怎么让子物体根据父物体来改变自身的宽度?

类似Unity 中 Horizontal Layout Group 的 Control Child Size
比如父物体是300宽度
如果有3个子物体,每个子物体就是100宽度
如果有6个子物体,每个子物体就是50宽度

FairyGUI编辑器怎么制作类似的效果?
QQ截图20181108142248.png
已邀请:

谷主

赞同来自: shizuim005645

如果数量是固定的,用高级组的水平布局。
如果数量是运行时动态改变的,用列表的流动布局,设置好列数,并勾选自动调整列表项目大小。

谷主

赞同来自: shizuim005645

我试过了,可能是由于积累误差吧,因为item的位置一定是整数的,间距也是整数的,否则文字会显示模糊。

shizuim005645

赞同来自:

QQ截图20181108172331.png

需要在运行时动态改变
需求是只有单行,列表的总宽度保持不变,变的只是子物体的宽度,且每个子物体的宽度都要一致
自动调整列表项目大小好像不能调整最后一个子物体,如果要让每个子物体的宽度一样,就需要去改列表的总宽度,就跟需求冲突了
不知道该怎么去调

谷主

赞同来自:

我搞不懂你的需求了,一时一个样。你既然是要直接改item的宽度,而不是改列表的宽度,那就什么都不用设了,不需要什么自动调整宽度,一个循环把所有item设置你要的宽度就行了。列表会自动重排的。

shizuim005645

赞同来自:

不好意思我没说清楚
列表的总宽度不变,这个指的是一旦设置好了总宽度,就不希望系统去改变它的宽度,总宽度永远保持一致
在列表下加入新的子物体时,如果要保持总宽度不变,子物体间的间距也不变,就只能去减少子物体的宽度,我是希望系统能自动去计算子物体的宽度,我就不需要去手动设置
这个跟Unity里开启了 Control Child Size 的 Horizontal Layout Group 的类似,只需要去设置父物体的宽度,然后不停的往父物体添加子物体就行,根本不需要去关心子物体的宽度是什么,这些都是由系统计算的,我是想达到这样的效果,希望FairyGUI里的列表可以根据子物体数量、间距来自动计算子物体的宽度

谷主

赞同来自:

那按我最开始说的就可以啊,有多少个就设置列数为多少,测试正常。至于你那个为什么显示成那样,我真不知道了。

shizuim005645

赞同来自:

"如果数量是运行时动态改变的,用列表的流动布局,设置好列数,并勾选自动调整列表项目大小。"
我是按照这个做的,但是一直存在这个问题
我把工程上传了,大佬能帮忙看下吗?
谢谢

shizuim005645

赞同来自:

又研究了一下这个
如果问题是积累误差的话,把宽度改得很大就可以减少这个的影响,我把列表的宽度改成之前的100倍,横向缩放改成0.01,每个格子的宽度基本上都是一致的
但是会有新的问题,九宫格会失效,毕竟九宫格是基于像素的,所以列表内的格子(项目)的宽度不能改,要把格子的横向缩放改成100倍
这样的话会导致列表自动计算的格子位置失效,所以要自行设置每个格子的位置
 
最后的结果是这样的
每个格子的宽度都一致,九宫格也有效,也是均匀排列的
但是添加和减少格子的时候总是会抖一下
Honeycam_2018-11-16_16-04-06.gif

感觉是系统和我同时在修改格子的位置
不知道该怎么解决
麻烦大佬指点下
 
代码:
public class ListMain : MonoBehaviour
{
static int SCALE = 100;
static float M_SCALE = (float)1 / SCALE;

GComponent _mainView;
GList _cellList;

void Start()
{
Application.targetFrameRate = 60;

UIPackage.AddPackage("Package1");

_mainView = this.GetComponent<UIPanel>().ui;
_cellList = _mainView.GetChild("list").asList;

//宽度和间隔放大100倍,Scale改成0.01,解决浮点数转整型导致的格子溢出的问题,但是会导致九宫格失效
_cellList.initWidth *= SCALE;
_cellList.scaleX = M_SCALE;
_cellList.columnGap *= SCALE;
}

void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
_cellList.numItems = _cellList.numChildren - 1;
_cellList.columnCount = _cellList.numChildren;
}
if (Input.GetKeyDown(KeyCode.D))
{
_cellList.numItems = _cellList.numChildren + 1;
_cellList.columnCount = _cellList.numChildren;
}
CalculateListCell();
}

void CalculateListCell()
{
//计算所有间距占用的像素
int gapTotalWidth = (_cellList.numChildren - 1) * _cellList.columnGap;
//单个格子占用的像素
float singleCellWidth = (float)(_cellList.initWidth - gapTotalWidth) / _cellList.numChildren;

int count = _cellList.numChildren;
for (int i = 0; i < count; i++)
{
GObject cell = _cellList.GetChildAt(i);
//解决九宫格失效的问题,格子的宽度维持原样,横向放大100倍
cell.width = singleCellWidth * M_SCALE;
cell.scaleX = SCALE;
//宽度维持原样会导致位置排列出错,需要重新设置格子位置
cell.SetPosition(i * (_cellList.columnGap + singleCellWidth), cell.position.y, cell.position.z);
}
}
}

工程(附件传不上,上传到百度云):
https://pan.baidu.com/s/1ZnC9KAXcgi8EAJkyVZtQkg
A减少格子,D增加格子

shizuim005645

赞同来自:

大佬,这个闪烁的问题该怎么解决呀?

要回复问题请先登录注册