计算字体宽度及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<RectTransform>();
    #endregion

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

//测试方法
private void Test()
{
    ChatInfo info1 = Instantiate(LeftChatObj, ChatContent).GetComponent<ChatInfo>();
    ChatInfo info2 = Instantiate(RightChatObj, ChatContent).GetComponent<ChatInfo>();
    //
    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<RectTransform>();
    RtBgEmpty = transform.Find("ContentEmpty/BgEmpty").GetComponent<RectTransform>();
    RtContentEmpty = transform.Find("ContentEmpty").GetComponent<RectTransform>();
    RtSelf = transform.GetComponent<RectTransform>();
    #endregion

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


/// <summary>
/// 设置聊天内容
/// </summary>
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<UICharInfo> 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伊  阅读(314)  评论(0编辑  收藏  举报