当前位置 博文首页 > Miss伊:计算字体宽度及Text组件的自适应

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

    作者:Miss伊 时间:2021-01-18 10:03

    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]);
        }
    }
    

    }