本文已参与「新人创作礼」活动,一起开启掘金创作之路。
实现效果图示:
在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);
}
}