暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

ItemStyle.cs 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. using UnityEngine;
  2. namespace XCharts.Runtime
  3. {
  4. /// <summary>
  5. /// 图形样式。
  6. /// </summary>
  7. [System.Serializable]
  8. public class ItemStyle : ChildComponent, ISerieDataComponent
  9. {
  10. [SerializeField] private bool m_Show = true;
  11. [SerializeField] private Color32 m_Color;
  12. [SerializeField] private Color32 m_Color0;
  13. [SerializeField] private Color32 m_ToColor;
  14. [SerializeField] private Color32 m_ToColor2;
  15. [SerializeField][Since("v3.6.0")] private Color32 m_MarkColor;
  16. [SerializeField] private Color32 m_BackgroundColor;
  17. [SerializeField] private float m_BackgroundWidth;
  18. [SerializeField] private Color32 m_CenterColor;
  19. [SerializeField] private float m_CenterGap;
  20. [SerializeField] private float m_BorderWidth = 0;
  21. [SerializeField] private float m_BorderGap = 0;
  22. [SerializeField] private Color32 m_BorderColor;
  23. [SerializeField] private Color32 m_BorderColor0;
  24. [SerializeField] private Color32 m_BorderToColor;
  25. [SerializeField][Range(0, 1)] private float m_Opacity = 1;
  26. [SerializeField] private string m_ItemMarker;
  27. [SerializeField] private string m_ItemFormatter;
  28. [SerializeField] private string m_NumericFormatter = "";
  29. [SerializeField] private float[] m_CornerRadius = new float[] { 0, 0, 0, 0 };
  30. public void Reset()
  31. {
  32. m_Show = false;
  33. m_Color = Color.clear;
  34. m_Color0 = Color.clear;
  35. m_ToColor = Color.clear;
  36. m_ToColor2 = Color.clear;
  37. m_MarkColor = Color.clear;
  38. m_BackgroundColor = Color.clear;
  39. m_BackgroundWidth = 0;
  40. m_CenterColor = Color.clear;
  41. m_CenterGap = 0;
  42. m_BorderWidth = 0;
  43. m_BorderGap = 0;
  44. m_BorderColor = Color.clear;
  45. m_BorderColor0 = Color.clear;
  46. m_BorderToColor = Color.clear;
  47. m_Opacity = 1;
  48. m_ItemFormatter = null;
  49. m_ItemMarker = null;
  50. m_NumericFormatter = "";
  51. if (m_CornerRadius == null)
  52. {
  53. m_CornerRadius = new float[] { 0, 0, 0, 0 };
  54. }
  55. else
  56. {
  57. for (int i = 0; i < m_CornerRadius.Length; i++)
  58. m_CornerRadius[i] = 0;
  59. }
  60. }
  61. /// <summary>
  62. /// 是否启用。
  63. /// </summary>
  64. public bool show
  65. {
  66. get { return m_Show; }
  67. set { if (PropertyUtil.SetStruct(ref m_Show, value)) SetVerticesDirty(); }
  68. }
  69. /// <summary>
  70. /// 数据项颜色。
  71. /// </summary>
  72. public Color32 color
  73. {
  74. get { return m_Color; }
  75. set { if (PropertyUtil.SetColor(ref m_Color, value)) SetVerticesDirty(); }
  76. }
  77. /// <summary>
  78. /// 数据项颜色。
  79. /// </summary>
  80. public Color32 color0
  81. {
  82. get { return m_Color0; }
  83. set { if (PropertyUtil.SetColor(ref m_Color0, value)) SetVerticesDirty(); }
  84. }
  85. /// <summary>
  86. /// Gradient color1.
  87. /// |渐变色的颜色1。
  88. /// </summary>
  89. public Color32 toColor
  90. {
  91. get { return m_ToColor; }
  92. set { if (PropertyUtil.SetColor(ref m_ToColor, value)) SetVerticesDirty(); }
  93. }
  94. /// <summary>
  95. /// Gradient color2.Only valid in line diagrams.
  96. /// |渐变色的颜色2。只在折线图中有效。
  97. /// </summary>
  98. public Color32 toColor2
  99. {
  100. get { return m_ToColor2; }
  101. set { if (PropertyUtil.SetColor(ref m_ToColor2, value)) SetVerticesDirty(); }
  102. }
  103. /// <summary>
  104. /// Serie's mark color. It is only used to display Legend and Tooltip, and does not affect the drawing color. The default value is clear.
  105. /// |Serie的标识颜色。仅用于Legend和Tooltip的展示,不影响绘制颜色,默认为clear。
  106. /// </summary>
  107. public Color32 markColor
  108. {
  109. get { return m_MarkColor; }
  110. set { if (PropertyUtil.SetStruct(ref m_MarkColor, value)) { SetAllDirty(); } }
  111. }
  112. /// <summary>
  113. /// 数据项背景颜色。
  114. /// </summary>
  115. public Color32 backgroundColor
  116. {
  117. get { return m_BackgroundColor; }
  118. set { if (PropertyUtil.SetColor(ref m_BackgroundColor, value)) SetVerticesDirty(); }
  119. }
  120. /// <summary>
  121. /// 数据项背景宽度。
  122. /// </summary>
  123. public float backgroundWidth
  124. {
  125. get { return m_BackgroundWidth; }
  126. set { if (PropertyUtil.SetStruct(ref m_BackgroundWidth, value)) SetVerticesDirty(); }
  127. }
  128. /// <summary>
  129. /// 中心区域颜色。
  130. /// </summary>
  131. public Color32 centerColor
  132. {
  133. get { return m_CenterColor; }
  134. set { if (PropertyUtil.SetColor(ref m_CenterColor, value)) SetVerticesDirty(); }
  135. }
  136. /// <summary>
  137. /// 中心区域间隙。
  138. /// </summary>
  139. public float centerGap
  140. {
  141. get { return m_CenterGap; }
  142. set { if (PropertyUtil.SetStruct(ref m_CenterGap, value)) SetVerticesDirty(); }
  143. }
  144. /// <summary>
  145. /// 边框的颜色。
  146. /// </summary>
  147. public Color32 borderColor
  148. {
  149. get { return m_BorderColor; }
  150. set { if (PropertyUtil.SetColor(ref m_BorderColor, value)) SetVerticesDirty(); }
  151. }
  152. /// <summary>
  153. /// 边框的颜色。
  154. /// </summary>
  155. public Color32 borderColor0
  156. {
  157. get { return m_BorderColor0; }
  158. set { if (PropertyUtil.SetColor(ref m_BorderColor0, value)) SetVerticesDirty(); }
  159. }
  160. /// <summary>
  161. /// 边框的渐变色。
  162. /// </summary>
  163. public Color32 borderToColor
  164. {
  165. get { return m_BorderToColor; }
  166. set { if (PropertyUtil.SetColor(ref m_BorderToColor, value)) SetVerticesDirty(); }
  167. }
  168. /// <summary>
  169. /// 边框宽。
  170. /// </summary>
  171. public float borderWidth
  172. {
  173. get { return m_BorderWidth; }
  174. set { if (PropertyUtil.SetStruct(ref m_BorderWidth, value)) SetVerticesDirty(); }
  175. }
  176. /// <summary>
  177. /// 边框间隙。
  178. /// </summary>
  179. public float borderGap
  180. {
  181. get { return m_BorderGap; }
  182. set { if (PropertyUtil.SetStruct(ref m_BorderGap, value)) SetVerticesDirty(); }
  183. }
  184. /// <summary>
  185. /// 透明度。支持从 0 到 1 的数字,为 0 时不绘制该图形。
  186. /// </summary>
  187. public float opacity
  188. {
  189. get { return m_Opacity; }
  190. set { if (PropertyUtil.SetStruct(ref m_Opacity, value)) SetVerticesDirty(); }
  191. }
  192. /// <summary>
  193. /// 提示框单项的字符串模版格式器。具体配置参考`Tooltip`的`formatter`
  194. /// </summary>
  195. public string itemFormatter
  196. {
  197. get { return m_ItemFormatter; }
  198. set { if (PropertyUtil.SetClass(ref m_ItemFormatter, value)) SetVerticesDirty(); }
  199. }
  200. /// <summary>
  201. /// 提示框单项的字符标志。用在Tooltip中。
  202. /// </summary>
  203. public string itemMarker
  204. {
  205. get { return m_ItemMarker; }
  206. set { if (PropertyUtil.SetClass(ref m_ItemMarker, value)) SetVerticesDirty(); }
  207. }
  208. /// <summary>
  209. /// Standard numeric format strings.
  210. /// |标准数字格式字符串。用于将数值格式化显示为字符串。
  211. /// 使用Axx的形式:A是格式说明符的单字符,支持C货币、D十进制、E指数、F定点数、G常规、N数字、P百分比、R往返、X十六进制的。xx是精度说明,从0-99。
  212. /// 参考:https://docs.microsoft.com/zh-cn/dotnet/standard/base-types/standard-numeric-format-strings
  213. /// </summary>
  214. /// <value></value>
  215. public string numericFormatter
  216. {
  217. get { return m_NumericFormatter; }
  218. set { if (PropertyUtil.SetClass(ref m_NumericFormatter, value)) SetComponentDirty(); }
  219. }
  220. /// <summary>
  221. /// The radius of rounded corner. Its unit is px. Use array to respectively specify the 4 corner radiuses((clockwise upper left, upper right, bottom right and bottom left)).
  222. /// |圆角半径。用数组分别指定4个圆角半径(顺时针左上,右上,右下,左下)。
  223. /// </summary>
  224. public float[] cornerRadius
  225. {
  226. get { return m_CornerRadius; }
  227. set { if (PropertyUtil.SetClass(ref m_CornerRadius, value, true)) SetVerticesDirty(); }
  228. }
  229. /// <summary>
  230. /// 实际边框宽。边框不显示时为0。
  231. /// </summary>
  232. public float runtimeBorderWidth { get { return NeedShowBorder() ? borderWidth : 0; } }
  233. /// <summary>
  234. /// 是否需要显示边框。
  235. /// </summary>
  236. public bool NeedShowBorder()
  237. {
  238. return borderWidth != 0 && !ChartHelper.IsClearColor(borderColor);
  239. }
  240. public Color32 GetColor()
  241. {
  242. if (m_Opacity == 1 || m_Color.a == 0)
  243. return m_Color;
  244. var color = m_Color;
  245. color.a = (byte) (color.a * m_Opacity);
  246. return color;
  247. }
  248. public Color32 GetToColor()
  249. {
  250. if (m_Opacity == 1 || m_ToColor.a == 0)
  251. return m_ToColor;
  252. var color = m_ToColor;
  253. color.a = (byte) (color.a * m_Opacity);
  254. return color;
  255. }
  256. public Color32 GetColor0()
  257. {
  258. if (m_Opacity == 1 || m_Color0.a == 0)
  259. return m_Color0;
  260. var color = m_Color0;
  261. color.a = (byte) (color.a * m_Opacity);
  262. return color;
  263. }
  264. public Color32 GetColor(Color32 defaultColor)
  265. {
  266. var color = ChartHelper.IsClearColor(m_Color) ? defaultColor : m_Color;
  267. if (m_Opacity == 1 || color.a == 0)
  268. return color;
  269. color.a = (byte) (color.a * m_Opacity);
  270. return color;
  271. }
  272. public Color32 GetColor0(Color32 defaultColor)
  273. {
  274. var color = ChartHelper.IsClearColor(m_Color0) ? defaultColor : m_Color0;
  275. if (m_Opacity == 1 || color.a == 0)
  276. return color;
  277. color.a = (byte) (color.a * m_Opacity);
  278. return color;
  279. }
  280. public Color32 GetBorderColor(Color32 defaultColor)
  281. {
  282. var color = ChartHelper.IsClearColor(m_BorderColor) ? defaultColor : m_BorderColor;
  283. if (m_Opacity == 1 || color.a == 0)
  284. return color;
  285. color.a = (byte) (color.a * m_Opacity);
  286. return color;
  287. }
  288. public Color32 GetBorderColor0(Color32 defaultColor)
  289. {
  290. var color = ChartHelper.IsClearColor(m_BorderColor0) ? defaultColor : m_BorderColor0;
  291. if (m_Opacity == 1 || color.a == 0)
  292. return color;
  293. color.a = (byte) (color.a * m_Opacity);
  294. return color;
  295. }
  296. public bool IsNeedGradient()
  297. {
  298. return !ChartHelper.IsClearColor(m_ToColor) || !ChartHelper.IsClearColor(m_ToColor2);
  299. }
  300. public Color32 GetGradientColor(float value, Color32 defaultColor)
  301. {
  302. if (!IsNeedGradient())
  303. return ChartConst.clearColor32;
  304. value = Mathf.Clamp01(value);
  305. var startColor = ChartHelper.IsClearColor(m_Color) ? defaultColor : m_Color;
  306. Color32 color;
  307. if (!ChartHelper.IsClearColor(m_ToColor2))
  308. {
  309. if (value <= 0.5f)
  310. color = Color32.Lerp(startColor, m_ToColor, 2 * value);
  311. else
  312. color = Color32.Lerp(m_ToColor, m_ToColor2, 2 * (value - 0.5f));
  313. }
  314. else
  315. {
  316. color = Color32.Lerp(startColor, m_ToColor, value);
  317. }
  318. if (m_Opacity != 1)
  319. {
  320. color.a = (byte) (color.a * m_Opacity);
  321. }
  322. return color;
  323. }
  324. public bool IsNeedCorner()
  325. {
  326. if (m_CornerRadius == null) return false;
  327. foreach (var value in m_CornerRadius)
  328. {
  329. if (value != 0) return true;
  330. }
  331. return false;
  332. }
  333. }
  334. }