AxisUtils.java 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package utils;
  2. import view.Axis;
  3. import view.AxisBorder;
  4. import view.Point;
  5. import javax.imageio.ImageIO;
  6. import java.awt.*;
  7. import java.awt.image.BufferedImage;
  8. import java.io.File;
  9. import java.text.SimpleDateFormat;
  10. import java.util.Calendar;
  11. import java.util.Date;
  12. /**
  13. * @author duh
  14. * @create 2018/7/17 15:03
  15. * @email duh@elab-plus.com
  16. **/
  17. public class AxisUtils {
  18. public static void drawAxis(AxisBorder border ,Axis xaxis, Axis yaxis, int width, int height, Graphics2D g){
  19. //抗锯齿 字体更平滑
  20. g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  21. // drawBorder(border, width, height, g);
  22. drawXAxis(border, xaxis, width, height, g);
  23. drawYAxis(border, yaxis, width, height, g);
  24. //设置作图区域颜色为白色
  25. // g.setColor(new Color(0xFFFFFF));
  26. // g.fillRect(border.getLeft(), border.getTop(), width, height);
  27. }
  28. /**
  29. * 画x轴坐标
  30. * @param axisBorder
  31. * @param xaxis
  32. * @param width
  33. * @param height
  34. * @param g
  35. */
  36. private static void drawXAxis(AxisBorder axisBorder,
  37. Axis xaxis, int width ,int height, Graphics2D g){
  38. //画x坐标
  39. Point point1 = new Point(axisBorder.getLeft(), axisBorder.getTop() + height);
  40. Point point2 = new Point(axisBorder.getLeft() + width, axisBorder.getTop() + height);
  41. drawLine(point1, point2, new Color(xaxis.getLineColor()) , xaxis.getLineWidth(), g);
  42. //画刻度
  43. int ticks = xaxis.getTicks();
  44. int skips = width / ticks;
  45. int x = axisBorder.getLeft();
  46. int y1 = axisBorder.getTop() + height ;
  47. int y2 = y1 + 10;
  48. String type = xaxis.getType(); //获取坐标轴类型
  49. for(int i = 1 ; i <= ticks ; i++){
  50. point1 = new Point(x + skips * i,y1);
  51. point2 = new Point(x + skips * i,y2);
  52. drawLine(point1, point2, new Color(xaxis.getLineColor()) , xaxis.getLineWidth(), g);
  53. }
  54. //画label
  55. if(type.equals(Axis.VALUE)){
  56. double vskips = (xaxis.getMax() - xaxis.getMin() ) / ticks + xaxis.getMin();
  57. for(int i = 1 ; i <= ticks ; i++){
  58. drawString(g, x + skips * i, y2, getValueLabel(vskips * i + xaxis.getMin(), xaxis.getLabelFormat()));
  59. }
  60. }else if(type.equals(Axis.DATETIME)){
  61. long t0 = xaxis.getStartDate().getTime() ;
  62. long tskips = ( xaxis.getEndDate().getTime() - t0 ) /ticks;
  63. Calendar c = Calendar.getInstance();
  64. for(int i = 1 ; i <= ticks ; i++){
  65. c.setTimeInMillis(t0 + i * tskips);
  66. drawString(g, x + skips * i, y2+10, getDateLabel(c.getTime(), xaxis.getLabelFormat()));
  67. }
  68. }
  69. //画title
  70. drawString(g, axisBorder.getLeft(),
  71. axisBorder.getTop() + height + axisBorder.getBottom() /2, xaxis.getTitle());
  72. }
  73. /**
  74. * 画Y轴坐标
  75. * @param axisBorder
  76. * @param axis
  77. * @param width
  78. * @param height
  79. * @param g
  80. */
  81. private static void drawYAxis(AxisBorder axisBorder,
  82. Axis axis, int width ,int height, Graphics2D g){
  83. //画x坐标
  84. Point point1 = new Point(axisBorder.getLeft(), axisBorder.getTop() + height);
  85. Point point2 = new Point(axisBorder.getLeft(), axisBorder.getTop());
  86. drawLine(point1, point2, new Color(axis.getLineColor()) , axis.getLineWidth(), g);
  87. //画刻度
  88. int ticks = axis.getTicks();
  89. int skips = height / ticks;
  90. int x1 = axisBorder.getLeft();
  91. int x2 = x1 - 10 ;
  92. int y1 = axisBorder.getTop() + height ;
  93. String type = axis.getType(); //获取坐标轴类型
  94. for(int i = 1 ; i <= ticks ; i++){
  95. point1 = new Point(x2,y1 - skips * i);
  96. point2 = new Point(x1,y1 - skips * i);
  97. drawLine(point1, point2, new Color(axis.getLineColor()) , axis.getLineWidth(), g);
  98. }
  99. //画label
  100. if(type.equals(Axis.VALUE)){
  101. double vskips = (axis.getMax() - axis.getMin() ) / ticks + axis.getMin();
  102. for(int i = 1 ; i <= ticks ; i++){
  103. drawString(g, x2 - 20 , y1 - skips * i, getValueLabel(vskips * i + axis.getMin(), axis.getLabelFormat()));
  104. }
  105. }else if(type.equals(Axis.DATETIME)){
  106. long t0 = axis.getStartDate().getTime() ;
  107. long tskips = ( axis.getEndDate().getTime() - t0 ) /ticks;
  108. Calendar c = Calendar.getInstance();
  109. for(int i = 1 ; i <= ticks ; i++){
  110. c.setTimeInMillis(t0 + i * tskips);
  111. drawString(g, x2 - 20 , y1 - skips * i, getDateLabel(c.getTime(), axis.getLabelFormat()));
  112. }
  113. }
  114. //画title
  115. //画y坐标title
  116. int x = Math.min(30, axisBorder.getLeft());
  117. int y0 = axisBorder.getTop() + height/2 + 80;
  118. //逆时针旋转180度
  119. g.rotate(-Math.PI/2, x, y0);
  120. Font font = new Font("宋体", Font.BOLD, 16);
  121. g.setFont(font);
  122. g.drawString(axis.getTitle(),x,y0);
  123. //恢复画布,顺时针旋转180度
  124. g.rotate(Math.PI/2,x,y0);
  125. }
  126. /**
  127. * 画线
  128. * @param point1
  129. * @param point2
  130. * @param lineColor
  131. * @param lineWidth
  132. * @param g
  133. */
  134. private static void drawLine(Point point1 , Point point2, Color lineColor, int lineWidth ,Graphics2D g){
  135. g.setStroke(new BasicStroke(lineWidth));
  136. g.setColor(lineColor);
  137. g.drawLine(point1.getX(), point1.getY(), point2.getX(), point2.getY());
  138. }
  139. /**
  140. * 写字符
  141. */
  142. private static void drawString(Graphics2D g,int x ,int y,String str){
  143. g.drawString(str, x, y);
  144. }
  145. /**
  146. * 获取数字型label
  147. * @param value
  148. * @param format
  149. * @return
  150. */
  151. public static String getValueLabel(double value , String format ){
  152. if(format == null || format.equals("")){
  153. return value +"";
  154. }
  155. return String.format(format, value+"");
  156. }
  157. /**
  158. * 获取时间类型label
  159. * @param date
  160. * @param format
  161. * @return
  162. */
  163. public static String getDateLabel(Date date , String format){
  164. SimpleDateFormat sdf = new SimpleDateFormat("dd");
  165. if(format == null || format.equals("")){
  166. format = "dd日HH时";
  167. }
  168. sdf.applyPattern(format);
  169. return sdf.format(date);
  170. }
  171. /**
  172. * 画border
  173. * @param border
  174. * @param width
  175. * @param height
  176. * @param g
  177. */
  178. public static void drawBorder(AxisBorder border, int width, int height,Graphics2D g){
  179. g.setColor(new Color(border.getBackgroundColor()));
  180. g.fillRect(0, 0, border.getLeft(), border.getTop()+height+border.getBottom()); //填充背景色
  181. g.fillRect(border.getLeft(), 0, width+border.getRight(), border.getTop());
  182. g.fillRect(border.getLeft(), border.getTop()+height, width+border.getRight(), border.getBottom());
  183. g.fillRect(border.getLeft()+width, border.getTop(), border.getRight(), height);
  184. }
  185. }