| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360 | using System;using UnityEngine;#if dUI_TextMeshProusing TMPro;#endifnamespace XCharts.Runtime{    /// <summary>    /// Location type. Quick to set the general location.    /// ||位置类型。通过Align快速设置大体位置,再通过left,right,top,bottom微调具体位置。    /// </summary>    [Serializable]    public class Location : ChildComponent, IPropertyChanged    {        /// <summary>        /// 对齐方式        /// </summary>        public enum Align        {            TopLeft,            TopRight,            TopCenter,            BottomLeft,            BottomRight,            BottomCenter,            Center,            CenterLeft,            CenterRight        }        [SerializeField] private Align m_Align = Align.TopCenter;        [SerializeField] private float m_Left;        [SerializeField] private float m_Right;        [SerializeField] private float m_Top;        [SerializeField] private float m_Bottom;        private TextAnchor m_TextAlignment;#if dUI_TextMeshPro        private TextAlignmentOptions m_TMPTextAlignment;#endif        private Vector2 m_AnchorMin;        private Vector2 m_AnchorMax;        private Vector2 m_Pivot;        /// <summary>        /// 对齐方式。        /// </summary>        public Align align        {            get { return m_Align; }            set { if (PropertyUtil.SetStruct(ref m_Align, value)) { SetComponentDirty(); UpdateAlign(); } }        }        /// <summary>        /// Distance between component and the left side of the container.        /// ||离容器左侧的距离。        /// </summary>        public float left        {            get { return m_Left; }            set { if (PropertyUtil.SetStruct(ref m_Left, value)) { SetComponentDirty(); UpdateAlign(); } }        }        /// <summary>        /// Distance between component and the left side of the container.        /// ||离容器右侧的距离。        /// </summary>        public float right        {            get { return m_Right; }            set { if (PropertyUtil.SetStruct(ref m_Right, value)) { SetComponentDirty(); UpdateAlign(); } }        }        /// <summary>        /// Distance between component and the left side of the container.        /// ||离容器上侧的距离。        /// </summary>        public float top        {            get { return m_Top; }            set { if (PropertyUtil.SetStruct(ref m_Top, value)) { SetComponentDirty(); UpdateAlign(); } }        }        /// <summary>        /// Distance between component and the left side of the container.        /// ||离容器下侧的距离。        /// </summary>        public float bottom        {            get { return m_Bottom; }            set { if (PropertyUtil.SetStruct(ref m_Bottom, value)) { SetComponentDirty(); UpdateAlign(); } }        }        /// <summary>        /// the anchor of text.        /// ||Location对应的Anchor锚点        /// </summary>        public TextAnchor runtimeTextAlignment { get { return m_TextAlignment; } }#if dUI_TextMeshPro        public TextAlignmentOptions runtimeTMPTextAlignment { get { return m_TMPTextAlignment; } }#endif        /// <summary>        /// the minimum achor.        /// ||Location对应的anchorMin。        /// </summary>        public Vector2 runtimeAnchorMin { get { return m_AnchorMin; } }        /// <summary>        /// the maximun achor.        /// ||Location对应的anchorMax.        /// ||</summary>        public Vector2 runtimeAnchorMax { get { return m_AnchorMax; } }        /// <summary>        /// the povot.        /// ||Loation对应的中心点。        /// </summary>        public Vector2 runtimePivot { get { return m_Pivot; } }        public float runtimeLeft { get; private set; }        public float runtimeRight { get; private set; }        public float runtimeBottom { get; private set; }        public float runtimeTop { get; private set; }        public static Location defaultLeft        {            get            {                return new Location()                {                    align = Align.CenterLeft,                    left = 0.03f,                    right = 0,                    top = 0,                    bottom = 0                };            }        }        public static Location defaultRight        {            get            {                return new Location()                {                    align = Align.CenterRight,                    left = 0,                    right = 0.03f,                    top = 0,                    bottom = 0                };            }        }        public static Location defaultTop        {            get            {                return new Location()                {                    align = Align.TopCenter,                    left = 0,                    right = 0,                    top = 0.03f,                    bottom = 0                };            }        }        public static Location defaultBottom        {            get            {                return new Location()                {                    align = Align.BottomCenter,                    left = 0,                    right = 0,                    top = 0,                    bottom = 0.03f                };            }        }        private void UpdateAlign()        {            switch (m_Align)            {                case Align.BottomCenter:                    m_TextAlignment = TextAnchor.LowerCenter;#if dUI_TextMeshPro                    m_TMPTextAlignment = TextAlignmentOptions.Bottom;#endif                    m_AnchorMin = new Vector2(0.5f, 0);                    m_AnchorMax = new Vector2(0.5f, 0);                    m_Pivot = new Vector2(0.5f, 0);                    break;                case Align.BottomLeft:                    m_TextAlignment = TextAnchor.LowerLeft;#if dUI_TextMeshPro                    m_TMPTextAlignment = TextAlignmentOptions.BottomLeft;#endif                    m_AnchorMin = new Vector2(0, 0);                    m_AnchorMax = new Vector2(0, 0);                    m_Pivot = new Vector2(0, 0);                    break;                case Align.BottomRight:                    m_TextAlignment = TextAnchor.LowerRight;#if dUI_TextMeshPro                    m_TMPTextAlignment = TextAlignmentOptions.BottomRight;#endif                    m_AnchorMin = new Vector2(1, 0);                    m_AnchorMax = new Vector2(1, 0);                    m_Pivot = new Vector2(1, 0);                    break;                case Align.Center:                    m_TextAlignment = TextAnchor.MiddleCenter;#if dUI_TextMeshPro                    m_TMPTextAlignment = TextAlignmentOptions.Center;#endif                    m_AnchorMin = new Vector2(0.5f, 0.5f);                    m_AnchorMax = new Vector2(0.5f, 0.5f);                    m_Pivot = new Vector2(0.5f, 0.5f);                    break;                case Align.CenterLeft:                    m_TextAlignment = TextAnchor.MiddleLeft;#if dUI_TextMeshPro                    m_TMPTextAlignment = TextAlignmentOptions.Left;#endif                    m_AnchorMin = new Vector2(0, 0.5f);                    m_AnchorMax = new Vector2(0, 0.5f);                    m_Pivot = new Vector2(0, 0.5f);                    break;                case Align.CenterRight:                    m_TextAlignment = TextAnchor.MiddleRight;#if dUI_TextMeshPro                    m_TMPTextAlignment = TextAlignmentOptions.Right;#endif                    m_AnchorMin = new Vector2(1, 0.5f);                    m_AnchorMax = new Vector2(1, 0.5f);                    m_Pivot = new Vector2(1, 0.5f);                    break;                case Align.TopCenter:                    m_TextAlignment = TextAnchor.UpperCenter;#if dUI_TextMeshPro                    m_TMPTextAlignment = TextAlignmentOptions.Top;#endif                    m_AnchorMin = new Vector2(0.5f, 1);                    m_AnchorMax = new Vector2(0.5f, 1);                    m_Pivot = new Vector2(0.5f, 1);                    break;                case Align.TopLeft:                    m_TextAlignment = TextAnchor.UpperLeft;#if dUI_TextMeshPro                    m_TMPTextAlignment = TextAlignmentOptions.TopLeft;#endif                    m_AnchorMin = new Vector2(0, 1);                    m_AnchorMax = new Vector2(0, 1);                    m_Pivot = new Vector2(0, 1);                    break;                case Align.TopRight:                    m_TextAlignment = TextAnchor.UpperRight;#if dUI_TextMeshPro                    m_TMPTextAlignment = TextAlignmentOptions.TopRight;#endif                    m_AnchorMin = new Vector2(1, 1);                    m_AnchorMax = new Vector2(1, 1);                    m_Pivot = new Vector2(1, 1);                    break;                default:                    break;            }        }        public bool IsBottom()        {            switch (m_Align)            {                case Align.BottomCenter:                case Align.BottomLeft:                case Align.BottomRight:                    return true;                default:                    return false;            }        }        public bool IsTop()        {            switch (m_Align)            {                case Align.TopCenter:                case Align.TopLeft:                case Align.TopRight:                    return true;                default:                    return false;            }        }        public bool IsCenter()        {            switch (m_Align)            {                case Align.Center:                case Align.CenterLeft:                case Align.CenterRight:                    return true;                default:                    return false;            }        }        public void UpdateRuntimeData(float chartWidth, float chartHeight)        {            runtimeLeft = left <= 1 ? left * chartWidth : left;            runtimeRight = right <= 1 ? right * chartWidth : right;            runtimeTop = top <= 1 ? top * chartHeight : top;            runtimeBottom = bottom <= 1 ? bottom * chartHeight : bottom;        }        /// <summary>        /// 返回在坐标系中的具体位置        /// </summary>        /// <param name="chartWidth"></param>        /// <param name="chartHeight"></param>        /// <returns></returns>        public Vector3 GetPosition(float chartWidth, float chartHeight)        {            UpdateRuntimeData(chartWidth, chartHeight);            switch (align)            {                case Align.BottomCenter:                    return new Vector3(chartWidth / 2, runtimeBottom);                case Align.BottomLeft:                    return new Vector3(runtimeLeft, runtimeBottom);                case Align.BottomRight:                    return new Vector3(chartWidth - runtimeRight, runtimeBottom);                case Align.Center:                    return new Vector3(chartWidth / 2, chartHeight / 2);                case Align.CenterLeft:                    return new Vector3(runtimeLeft, chartHeight / 2);                case Align.CenterRight:                    return new Vector3(chartWidth - runtimeRight, chartHeight / 2);                case Align.TopCenter:                    return new Vector3(chartWidth / 2, chartHeight - runtimeTop);                case Align.TopLeft:                    return new Vector3(runtimeLeft, chartHeight - runtimeTop);                case Align.TopRight:                    return new Vector3(chartWidth - runtimeRight, chartHeight - runtimeTop);                default:                    return Vector2.zero;            }        }        /// <summary>        /// 属性变更时更新textAnchor,minAnchor,maxAnchor,pivot        /// </summary>        public void OnChanged()        {            UpdateAlign();        }    }}
 |