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