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

  • A+
所属分类:.NET技术
摘要

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

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

}

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