-
计算字体宽度及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]);
}
}
}
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数