kr.jjoe64.graphview.series.TitleLineGraphSeries.java Source code

Java tutorial

Introduction

Here is the source code for kr.jjoe64.graphview.series.TitleLineGraphSeries.java

Source

/*
 * WiFi Analyzer
 * Copyright (C) 2016  VREM Software Development <VREMSoftwareDevelopment@gmail.com>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
 */

package kr.jjoe64.graphview.series;

/**
 * modified version of com.jjoe64.graphview.series.LineGraphSeries
 */

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.text.TextPaint;

import com.jjoe64.graphview.GraphView;
import com.jjoe64.graphview.series.BaseSeries;
import com.jjoe64.graphview.series.DataPointInterface;

import org.apache.commons.lang3.StringUtils;

import java.util.Iterator;

public class TitleLineGraphSeries<E extends DataPointInterface> extends BaseSeries<E> {
    private final Paint paint;
    private final TextPaint paintTitle;
    private final Paint paintBackground;
    private final Path path;
    private final Path pathBackground;
    private int thickness = 5;
    private boolean textBold = false;
    private int backgroundColor = Color.argb(100, 172, 218, 255);

    public TitleLineGraphSeries(E[] data) {
        super(data);

        paint = new Paint();
        paint.setStrokeCap(Paint.Cap.ROUND);
        paint.setStyle(Paint.Style.STROKE);

        paintTitle = new TextPaint();
        paintTitle.setTextAlign(Paint.Align.CENTER);

        paintBackground = new Paint();

        path = new Path();
        pathBackground = new Path();
    }

    @Override
    public void draw(GraphView graphView, Canvas canvas, boolean isSecondScale) {
        paint.setColor(getColor());
        paint.setStrokeWidth(thickness);
        paintBackground.setColor(backgroundColor);
        pathBackground.reset();

        resetDataPoints();

        // get data
        double maxX = graphView.getViewport().getMaxX(false);
        double minX = graphView.getViewport().getMinX(false);

        double maxY;
        double minY;
        if (isSecondScale) {
            maxY = graphView.getSecondScale().getMaxY(false);
            minY = graphView.getSecondScale().getMinY(false);
        } else {
            maxY = graphView.getViewport().getMaxY(false);
            minY = graphView.getViewport().getMinY(false);
        }

        // draw data
        double diffY = maxY - minY;
        double diffX = maxX - minX;

        float graphHeight = graphView.getGraphContentHeight();
        float graphWidth = graphView.getGraphContentWidth();
        float graphLeft = graphView.getGraphContentLeft();
        float graphTop = graphView.getGraphContentTop();

        // draw background
        double lastEndY = 0;
        double lastEndX = 0;

        double titleY = 0;

        double lastUsedEndX = 0;
        float firstX = 0;
        int i = 0;
        Iterator<E> values = getValues(minX, maxX);
        while (values.hasNext()) {
            E value = values.next();

            double valY = value.getY() - minY;
            double ratY = valY / diffY;
            double y = graphHeight * ratY;

            double valX = value.getX() - minX;
            double ratX = valX / diffX;
            double x = graphWidth * ratX;

            double orgX = x;
            double orgY = y;

            if (i > 0) {
                // overdraw
                if (x > graphWidth) { // end right
                    double b = ((graphWidth - lastEndX) * (y - lastEndY) / (x - lastEndX));
                    y = lastEndY + b;
                    x = graphWidth;
                }
                if (y < 0) { // end bottom
                    double b = ((0 - lastEndY) * (x - lastEndX) / (y - lastEndY));
                    x = lastEndX + b;
                    y = 0;
                }
                if (y > graphHeight) { // end top
                    double b = ((graphHeight - lastEndY) * (x - lastEndX) / (y - lastEndY));
                    x = lastEndX + b;
                    y = graphHeight;
                }
                if (lastEndY < 0) { // start bottom
                    double b = ((0 - y) * (x - lastEndX) / (lastEndY - y));
                    lastEndX = x - b;
                    lastEndY = 0;
                }
                if (lastEndX < 0) { // start left
                    double b = ((0 - x) * (y - lastEndY) / (lastEndX - x));
                    lastEndY = y - b;
                    lastEndX = 0;
                }
                if (lastEndY > graphHeight) { // start top
                    double b = ((graphHeight - y) * (x - lastEndX) / (lastEndY - y));
                    lastEndX = x - b;
                    lastEndY = graphHeight;
                }

                float startX = (float) lastEndX + (graphLeft + 1);
                float startY = (float) (graphTop - lastEndY) + graphHeight;
                float endX = (float) x + (graphLeft + 1);
                float endY = (float) (graphTop - y) + graphHeight;

                registerDataPoint(endX, endY, value);

                path.reset();
                path.moveTo(startX, startY);
                path.lineTo(endX, endY);
                canvas.drawPath(path, paint);
                if (i == 1) {
                    firstX = startX;
                    pathBackground.moveTo(startX, startY);
                }
                pathBackground.lineTo(endX, endY);
                lastUsedEndX = endX;
            }
            lastEndY = orgY;
            lastEndX = orgX;
            titleY = Math.max(titleY, orgY);
            i++;
        }

        pathBackground.lineTo((float) lastUsedEndX, graphHeight + graphTop);
        pathBackground.lineTo(firstX, graphHeight + graphTop);
        pathBackground.close();
        canvas.drawPath(pathBackground, paintBackground);

        if (StringUtils.isNotBlank(getTitle()) && lastUsedEndX > 0) {
            float x = (float) (lastUsedEndX + firstX) / 2;
            float y = (float) (graphTop - titleY) + graphHeight - 10;

            paintTitle.setColor(getColor());
            paintTitle.setTextSize(graphView.getLegendRenderer().getTextSize());
            paintTitle.setFakeBoldText(textBold);
            canvas.drawText(getTitle(), x, y, paintTitle);
        }
    }

    public void setBackgroundColor(int backgroundColor) {
        this.backgroundColor = backgroundColor;
    }

    public void setThickness(int thickness) {
        this.thickness = thickness;
    }

    public void setTextBold(boolean textBold) {
        this.textBold = textBold;
    }
}