【Unity】UGUI动态适配Text尺寸大小

1,484 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

实现效果图示:

在Text.text赋值字符串后,计算字符串的最优高度或宽度,可动态调整Text尺寸大小; 限制Text的最大和最小宽度,不限制高度,宽度介于最大与最小之间适配,自动调整高度; 通过设置Text组件的锚点,可以让文字往指定方向溢出偏移,上图锚点在中间,四个边界都会往外偏移; 可以用于聊天、公告等文字数量变化较大的场景。

缩放优先级:

  • 优先级1:文字数量少于单行最少限制数量,高度、宽度都不缩放,使用最小宽度;
  • 优先级2:文字数量多于单行最少限制数量,但少于单行最多限制数量,高度不变,宽度缩放,文字宽度介于最小与最大宽度之间;
  • 优先级3:文字数量多于单行最多限制数量,高度缩放,宽度不变,使用最大宽度,高度大于一行。

实现步骤:

  • if 文字数量 <= 单行最少限制数量,使用优先级1;
  • else if 文字数量 <= 单行最多限制数量,优先级2;
  • else 即文字数量 > 单行最多限制数量,优先级3。

关键API:

  • Text.preferredWidth / Text.preferredHeight : Text的最优宽度/高度,保持当前高度/宽度不变,计算最优宽度/高度;
  • Text.rectTransform.sizeDelta:设置rectTransform的尺寸大小。
public class Test : MonoBehaviour
{
    //Text最小/最大宽度
    private int textSizeMinWidth = 100;
    private int textSizeMaxWidth = 500;

    int index = 0;
    private void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            index++;
            Text targetText = GetComponent<Text>();
            string contentStr = "";
            for(int i = 0; i < index; i++)
            {
                contentStr += "测试";
            }
            SetTextSize(targetText,contentStr);
        }
    }

    private void SetTextSize(Text targetText,string contentStr)
    {
        if(targetText == null)
            return;

        targetText.text = contentStr;

        //宽高都不缩放
        if(targetText.preferredWidth <= textSizeMinWidth)
            return;

        //宽度缩放,高度不变
        if(targetText.preferredWidth <= textSizeMaxWidth)
        {
            targetText.rectTransform.sizeDelta = new Vector2(targetText.preferredWidth,targetText.rectTransform.sizeDelta.y);
            return;
        }

        //宽度最大,高度缩放
        //设置最大宽度
        targetText.rectTransform.sizeDelta = new Vector2(textSizeMaxWidth,targetText.rectTransform.sizeDelta.y);
        //设置最优高度
        int textSizeHeight = Mathf.CeilToInt(targetText.preferredHeight);
        targetText.rectTransform.sizeDelta = new Vector2(textSizeMaxWidth,textSizeHeight);
    }
}