123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321 |
- using System;
- using UnityEngine;
- #if dUI_TextMeshPro
- using TMPro;
- #endif
-
- namespace 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>
- /// <value></value>
- 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 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();
- }
- }
- }
|