/* * Copyright 2014 Diogo Bernardino * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.db.chart.view; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint.Align; /** * Class responsible to control horizontal measures, positions, yadda yadda. * If the drawing is requested it will also take care of it. */ public class XController extends AxisController{ /** Vertical coordinate where label will be drawn */ private int mLabelVerCoord; /** Width of last label of sets */ private float mLastLabelWidth; public XController(ChartView chartView) { super(chartView); } public XController(ChartView chartView, TypedArray attrs) { super(chartView); } /* * IMPORTANT: Method's order is crucial. Change it (or not) carefully. */ protected void init() { // Set the vertical display coordinate mLabelVerCoord = chartView.chartBottom; if(labelsPositioning == LabelPosition.INSIDE) mLabelVerCoord -= distLabelToAxis; defineLabels(); // To manage horizontal width of the last axis label mLastLabelWidth = chartView.style.labelPaint.measureText(labels.get(nLabels - 1)); defineMandatoryBorderSpacing(chartView.getInnerChartLeft(), getInnerChartRight()); defineLabelsPos(chartView.getInnerChartLeft(), getInnerChartRight()); } /* * --------- * Getters * --------- */ /** * Inner Chart refers only to the area where chart data will be draw, * excluding labels, axis, etc. * * @return Position of the inner right side of the chart */ public float getInnerChartRight(){ float rightBorder = 0; if(borderSpacing + mandatoryBorderSpacing < mLastLabelWidth / 2) rightBorder = mLastLabelWidth/2 - (borderSpacing + mandatoryBorderSpacing); return chartView.chartRight - rightBorder; } /** * Get the vertical position of axis. */ protected float getAxisVerticalPosition(){ if(labelsPositioning != LabelPosition.OUTSIDE) return chartView.chartBottom; return chartView.chartBottom - getLabelHeight() - distLabelToAxis; } /** * Based in a (real) value returns the associated screen point. * * @param value Value to be parsed in display coordinate * @return Display's coordinate */ protected float parsePos(int index, double value){ if(handleValues) return (float) (chartView.getInnerChartLeft() + (((value - minLabelValue) * screenStep) / (labelsValues.get(1) - minLabelValue))); else return labelsPos.get(index); } /* * ----------------- * Abstract Methods * ----------------- */ /** * Method called from onDraw method to draw XController data. * * @param canvas {@link android.graphics.Canvas} object to use while drawing the data. */ @Override protected void draw(Canvas canvas){ // Draw axis if(hasAxis) canvas.drawLine(chartView.getInnerChartLeft(), getAxisVerticalPosition(), getInnerChartRight(), getAxisVerticalPosition(), chartView.style.chartPaint); // Draw labels if(labelsPositioning != LabelPosition.NONE){ chartView.style.labelPaint.setTextAlign(Align.CENTER); for(int i = 0; i < nLabels; i++){ canvas.drawText(labels.get(i), labelsPos.get(i), mLabelVerCoord, chartView.style.labelPaint); } } } }