123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- package utils;
- import view.Axis;
- import view.AxisBorder;
- import view.Point;
- import javax.imageio.ImageIO;
- import java.awt.*;
- import java.awt.image.BufferedImage;
- import java.io.File;
- import java.text.SimpleDateFormat;
- import java.util.Calendar;
- import java.util.Date;
- /**
- * @author duh
- * @create 2018/7/17 15:03
- * @email duh@elab-plus.com
- **/
- public class AxisUtils {
- public static void drawAxis(AxisBorder border ,Axis xaxis, Axis yaxis, int width, int height, Graphics2D g){
- //抗锯齿 字体更平滑
- g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- // drawBorder(border, width, height, g);
- drawXAxis(border, xaxis, width, height, g);
- drawYAxis(border, yaxis, width, height, g);
- //设置作图区域颜色为白色
- // g.setColor(new Color(0xFFFFFF));
- // g.fillRect(border.getLeft(), border.getTop(), width, height);
- }
- /**
- * 画x轴坐标
- * @param axisBorder
- * @param xaxis
- * @param width
- * @param height
- * @param g
- */
- private static void drawXAxis(AxisBorder axisBorder,
- Axis xaxis, int width ,int height, Graphics2D g){
- //画x坐标
- Point point1 = new Point(axisBorder.getLeft(), axisBorder.getTop() + height);
- Point point2 = new Point(axisBorder.getLeft() + width, axisBorder.getTop() + height);
- drawLine(point1, point2, new Color(xaxis.getLineColor()) , xaxis.getLineWidth(), g);
- //画刻度
- int ticks = xaxis.getTicks();
- int skips = width / ticks;
- int x = axisBorder.getLeft();
- int y1 = axisBorder.getTop() + height ;
- int y2 = y1 + 10;
- String type = xaxis.getType(); //获取坐标轴类型
- for(int i = 1 ; i <= ticks ; i++){
- point1 = new Point(x + skips * i,y1);
- point2 = new Point(x + skips * i,y2);
- drawLine(point1, point2, new Color(xaxis.getLineColor()) , xaxis.getLineWidth(), g);
- }
- //画label
- if(type.equals(Axis.VALUE)){
- double vskips = (xaxis.getMax() - xaxis.getMin() ) / ticks + xaxis.getMin();
- for(int i = 1 ; i <= ticks ; i++){
- drawString(g, x + skips * i, y2, getValueLabel(vskips * i + xaxis.getMin(), xaxis.getLabelFormat()));
- }
- }else if(type.equals(Axis.DATETIME)){
- long t0 = xaxis.getStartDate().getTime() ;
- long tskips = ( xaxis.getEndDate().getTime() - t0 ) /ticks;
- Calendar c = Calendar.getInstance();
- for(int i = 1 ; i <= ticks ; i++){
- c.setTimeInMillis(t0 + i * tskips);
- drawString(g, x + skips * i, y2+10, getDateLabel(c.getTime(), xaxis.getLabelFormat()));
- }
- }
- //画title
- drawString(g, axisBorder.getLeft(),
- axisBorder.getTop() + height + axisBorder.getBottom() /2, xaxis.getTitle());
- }
- /**
- * 画Y轴坐标
- * @param axisBorder
- * @param axis
- * @param width
- * @param height
- * @param g
- */
- private static void drawYAxis(AxisBorder axisBorder,
- Axis axis, int width ,int height, Graphics2D g){
- //画x坐标
- Point point1 = new Point(axisBorder.getLeft(), axisBorder.getTop() + height);
- Point point2 = new Point(axisBorder.getLeft(), axisBorder.getTop());
- drawLine(point1, point2, new Color(axis.getLineColor()) , axis.getLineWidth(), g);
- //画刻度
- int ticks = axis.getTicks();
- int skips = height / ticks;
- int x1 = axisBorder.getLeft();
- int x2 = x1 - 10 ;
- int y1 = axisBorder.getTop() + height ;
- String type = axis.getType(); //获取坐标轴类型
- for(int i = 1 ; i <= ticks ; i++){
- point1 = new Point(x2,y1 - skips * i);
- point2 = new Point(x1,y1 - skips * i);
- drawLine(point1, point2, new Color(axis.getLineColor()) , axis.getLineWidth(), g);
- }
- //画label
- if(type.equals(Axis.VALUE)){
- double vskips = (axis.getMax() - axis.getMin() ) / ticks + axis.getMin();
- for(int i = 1 ; i <= ticks ; i++){
- drawString(g, x2 - 20 , y1 - skips * i, getValueLabel(vskips * i + axis.getMin(), axis.getLabelFormat()));
- }
- }else if(type.equals(Axis.DATETIME)){
- long t0 = axis.getStartDate().getTime() ;
- long tskips = ( axis.getEndDate().getTime() - t0 ) /ticks;
- Calendar c = Calendar.getInstance();
- for(int i = 1 ; i <= ticks ; i++){
- c.setTimeInMillis(t0 + i * tskips);
- drawString(g, x2 - 20 , y1 - skips * i, getDateLabel(c.getTime(), axis.getLabelFormat()));
- }
- }
- //画title
- //画y坐标title
- int x = Math.min(30, axisBorder.getLeft());
- int y0 = axisBorder.getTop() + height/2 + 80;
- //逆时针旋转180度
- g.rotate(-Math.PI/2, x, y0);
- Font font = new Font("宋体", Font.BOLD, 16);
- g.setFont(font);
- g.drawString(axis.getTitle(),x,y0);
- //恢复画布,顺时针旋转180度
- g.rotate(Math.PI/2,x,y0);
- }
- /**
- * 画线
- * @param point1
- * @param point2
- * @param lineColor
- * @param lineWidth
- * @param g
- */
- private static void drawLine(Point point1 , Point point2, Color lineColor, int lineWidth ,Graphics2D g){
- g.setStroke(new BasicStroke(lineWidth));
- g.setColor(lineColor);
- g.drawLine(point1.getX(), point1.getY(), point2.getX(), point2.getY());
- }
- /**
- * 写字符
- */
- private static void drawString(Graphics2D g,int x ,int y,String str){
- g.drawString(str, x, y);
- }
- /**
- * 获取数字型label
- * @param value
- * @param format
- * @return
- */
- public static String getValueLabel(double value , String format ){
- if(format == null || format.equals("")){
- return value +"";
- }
- return String.format(format, value+"");
- }
- /**
- * 获取时间类型label
- * @param date
- * @param format
- * @return
- */
- public static String getDateLabel(Date date , String format){
- SimpleDateFormat sdf = new SimpleDateFormat("dd");
- if(format == null || format.equals("")){
- format = "dd日HH时";
- }
- sdf.applyPattern(format);
- return sdf.format(date);
- }
- /**
- * 画border
- * @param border
- * @param width
- * @param height
- * @param g
- */
- public static void drawBorder(AxisBorder border, int width, int height,Graphics2D g){
- g.setColor(new Color(border.getBackgroundColor()));
- g.fillRect(0, 0, border.getLeft(), border.getTop()+height+border.getBottom()); //填充背景色
- g.fillRect(border.getLeft(), 0, width+border.getRight(), border.getTop());
- g.fillRect(border.getLeft(), border.getTop()+height, width+border.getRight(), border.getBottom());
- g.fillRect(border.getLeft()+width, border.getTop(), border.getRight(), height);
- }
- }
|