123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- using System;
- using UnityEngine;
- using UnityEngine.UI;
-
- namespace XCharts.Runtime
- {
- /// <summary>
- /// Text character limitation and adaptation component. When the length of the text exceeds the set length,
- /// it is cropped and suffixes are appended to the end.Only valid in the category axis.
- /// |文本字符限制和自适应。当文本长度超过设定的长度时进行裁剪,并将后缀附加在最后。
- /// 只在类目轴中有效。
- /// </summary>
- [Serializable]
- public class TextLimit : ChildComponent
- {
- [SerializeField] private bool m_Enable = false;
- [SerializeField] private float m_MaxWidth = 0;
- [SerializeField] private float m_Gap = 1;
- [SerializeField] private string m_Suffix = "...";
-
- /// <summary>
- /// Whether to enable text limit.
- /// |是否启用文本自适应。
- /// [default:true]
- /// </summary>
- public bool enable
- {
- get { return m_Enable; }
- set { if (PropertyUtil.SetStruct(ref m_Enable, value)) SetComponentDirty(); }
- }
- /// <summary>
- /// Set the maximum width. A default of 0 indicates automatic fetch; otherwise, custom.
- /// |Clipping occurs when the width of the text is greater than this value.
- /// |设定最大宽度。默认为0表示自动获取,否则表示自定义。当文本的宽度大于该值进行裁剪。
- /// </summary>
- public float maxWidth
- {
- get { return m_MaxWidth; }
- set { if (PropertyUtil.SetStruct(ref m_MaxWidth, value)) SetComponentDirty(); }
- }
- /// <summary>
- /// White pixel distance at both ends.
- /// |两边留白像素距离。
- /// [default:10f]
- /// </summary>
- public float gap
- {
- get { return m_Gap; }
- set { if (PropertyUtil.SetStruct(ref m_Gap, value)) SetComponentDirty(); }
- }
- /// <summary>
- /// Suffixes when the length exceeds.
- /// |长度超出时的后缀。
- /// [default: "..."]
- /// </summary>
- public string suffix
- {
- get { return m_Suffix; }
- set { if (PropertyUtil.SetClass(ref m_Suffix, value)) SetComponentDirty(); }
- }
-
- private ChartText m_RelatedText;
- private float m_RelatedTextWidth = 0;
-
- public TextLimit Clone()
- {
- var textLimit = new TextLimit();
- textLimit.enable = enable;
- textLimit.maxWidth = maxWidth;
- textLimit.gap = gap;
- textLimit.suffix = suffix;
- return textLimit;
- }
-
- public void Copy(TextLimit textLimit)
- {
- enable = textLimit.enable;
- maxWidth = textLimit.maxWidth;
- gap = textLimit.gap;
- suffix = textLimit.suffix;
- }
-
- public void SetRelatedText(ChartText txt, float labelWidth)
- {
- m_RelatedText = txt;
- m_RelatedTextWidth = labelWidth;
- }
-
- public string GetLimitContent(string content)
- {
- float checkWidth = m_MaxWidth > 0 ? m_MaxWidth : m_RelatedTextWidth;
- if (m_RelatedText == null || checkWidth <= 0)
- {
- return content;
- }
- else
- {
- if (m_Enable)
- {
- float len = m_RelatedText.GetPreferredWidth(content);
- float suffixLen = m_RelatedText.GetPreferredWidth(suffix);
- if (len >= checkWidth - m_Gap * 2)
- {
- return content.Substring(0, GetAdaptLength(content, suffixLen)) + suffix;
- }
- else
- {
- return content;
- }
- }
- else
- {
- return content;
- }
- }
- }
-
- private int GetAdaptLength(string content, float suffixLen)
- {
- int start = 0;
- int middle = content.Length / 2;
- int end = content.Length;
- float checkWidth = m_MaxWidth > 0 ? m_MaxWidth : m_RelatedTextWidth;
-
- float limit = checkWidth - m_Gap * 2 - suffixLen;
- if (limit < 0)
- return 0;
-
- float len = 0;
- while (len != limit && middle != start)
- {
- len = m_RelatedText.GetPreferredWidth(content.Substring(0, middle));
- if (len < limit)
- {
- start = middle;
- }
- else if (len > limit)
- {
- end = middle;
- }
- else
- {
- break;
- }
- middle = (start + end) / 2;
- }
- return middle;
- }
- }
- }
|