计算字体宽度及Text组件的自适应

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ChatView : MonoBehaviour
{

region RectTransform

private RectTransform ChatContent;
#endregion

region GameObject

private GameObject LeftChatObj;
private GameObject RightChatObj;
#endregion

private void Awake()
{
InitGetComponent();
}

private void Start()
{
Test();
}

private void InitGetComponent()
{
#region RectTransform
ChatContent = transform.Find("ChatPanel/ScrollView/Viewport/ChatContent").GetComponent();
#endregion

region GameObject

LeftChatObj = Resources.Load("Info/LeftChatInfo");
RightChatObj = Resources.Load("Info/RightChatInfo");
#endregion
}

//测试方法
private void Test()
{
ChatInfo info1 = Instantiate(LeftChatObj, ChatContent).GetComponent();
ChatInfo info2 = Instantiate(RightChatObj, ChatContent).GetComponent();
//
info1.SetChatText("椅子在异乡,树叶有翅膀,椅子在异乡,树叶有翅膀,椅子在异乡,树叶有翅膀");
info2.SetChatText("斯人如彩虹,遇上方知有,斯人如彩虹,遇上方知有,斯人如彩虹,遇上方知有,斯人如彩虹,遇上方知有,斯人如彩虹,遇上方知有");
UpdateLayout();
}

private void UpdateLayout()
{
UITools.Instance.UpdateLayout(ChatContent);
}
}

public class ChatInfo : MonoBehaviour
{

region RectTransform

private RectTransform RtChatContentText;
private RectTransform RtBgEmpty;
private RectTransform RtContentEmpty;
private RectTransform RtSelf;
#endregion

region Text

private Text ChatContentText;
#endregion

region float

//字体总宽高
private float m_FontTotalWidth = 0f;
private float m_FontTotalHeight = 0f;
//Text文本的宽高
private float m_TextWidth = 0f;
private float m_TextHeight = 0f;
//Text背景图宽高
private float m_TextBgWidth = 0f;
private float m_TextBgHeight = 0f;
#endregion

private void Awake()
{
InitGetComponent();
}

private void Start()
{
//SetChatText("椅子在异乡,树叶有翅膀。椅子在异乡,树叶有翅膀。椅子在异乡,树叶有翅膀。椅子在异乡,树叶有翅膀。椅子在异乡,树叶有翅膀。");
//SetChatText("椅子在异乡,树叶有翅膀。");
}

private void InitGetComponent()
{
#region RectTransform
RtChatContentText = transform.Find("ContentEmpty/BgEmpty/ChatContentText").GetComponent();
RtBgEmpty = transform.Find("ContentEmpty/BgEmpty").GetComponent();
RtContentEmpty = transform.Find("ContentEmpty").GetComponent();
RtSelf = transform.GetComponent();
#endregion

region Text

ChatContentText = transform.Find("ContentEmpty/BgEmpty/ChatContentText").GetComponent();
#endregion
}

///


/// 设置聊天内容
///

public void SetChatText(string str)
{
ChatContentText.text = str;
CalculateSize();
UpdateLayout();
}

//计算并设置文本大小
private void CalculateSize()
{
string str = ChatContentText.text;
TextGenerator generator = ChatContentText.cachedTextGenerator;
TextGenerationSettings textSetting = ChatContentText.GetGenerationSettings(Vector2.zero);
//字体的总宽高
m_FontTotalWidth = generator.GetPreferredWidth(str, textSetting);
m_FontTotalHeight = generator.GetPreferredHeight(str, textSetting);

IList tempList = generator.characters;
//计算新行,此方式可有效计算该行最后一个文字的宽度是否需要计算入下一行的宽度统计内
float tempWidth = 0;
int newLine = 0;
for (int i = 0; i < tempList.Count; i++)
{
tempWidth += tempList[i].charWidth;
if (tempWidth > 240f)
{
tempWidth = tempList[i].charWidth;
newLine += 1;
}
}
//获取Text文本宽高
m_TextWidth = RtChatContentText.rect.width;
m_TextHeight = RtChatContentText.rect.height;
//获取Text的Bg背景图(Text父级)宽高
m_TextBgWidth = RtBgEmpty.rect.width;
m_TextBgHeight = RtBgEmpty.rect.height;
//更新文本高度
m_TextHeight += newLine * 22f;
RtChatContentText.sizeDelta = new Vector2(m_TextWidth, m_TextHeight);
//更新文本Bg高度
m_TextBgHeight += newLine * 22f;
RtBgEmpty.sizeDelta = new Vector2(m_TextBgWidth, m_TextBgHeight);
}

//刷新布局
private void UpdateLayout()
{
UITools.Instance.UpdateLayout(RtContentEmpty, RtSelf);
}
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UITools : Singleton
{

public void UpdateLayout(params RectTransform[] rects)
{
for (int i = 0; i < rects.Length; i++)
{
LayoutRebuilder.ForceRebuildLayoutImmediate(rects[i]);
}
}
}

posted @ 2021-01-18 10:02  Miss伊  阅读(369)  评论(0)    收藏  举报