/* * 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 java.util.Collections; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint.Align; /** * Class responsible to control vertical measures, positions, yadda yadda. * If the drawing is requested it will also take care of it. */ public class YController extends AxisController{ public YController(ChartView chartView) { super(chartView); } public YController(ChartView chartView, TypedArray attrs) { super(chartView, attrs); } /* * IMPORTANT: Method's calls order is crucial. Change it (or not) carefully. */ protected void init(){ if(labelsPositioning == LabelPosition.INSIDE) distLabelToAxis *= -1; defineLabels(); defineMandatoryBorderSpacing(chartView.getInnerChartTop(), getInnerChartBottom()); defineAxisHorizontalPosition(); defineLabelsPos(chartView.getInnerChartTop(), getInnerChartBottom()); } /** * Calculates the starting X point of the axis */ protected void defineAxisHorizontalPosition(){ // Just in case Y labels need to be drawn if(labelsPositioning == LabelPosition.OUTSIDE){ float aux; float maxLabelLength = 0; for(String label : labels) if((aux = chartView.style.labelPaint.measureText(label)) > maxLabelLength) maxLabelLength = aux; axisHorPosition = chartView.chartLeft + maxLabelLength + distLabelToAxis; }else axisHorPosition = chartView.chartLeft; } @Override protected void defineLabelsPos(float innerStart, float innerEnd) { super.defineLabelsPos(innerStart, innerEnd); Collections.reverse(labelsPos); } /** * Based in a (real) value returns the associated screen point. * * @param value - Value to be parsed in display coordinate * @return Chart's coordinate */ protected float parsePos(int index, double value){ if(handleValues) return (float) ( chartView.horController.getAxisVerticalPosition() - (((value - minLabelValue) * screenStep) / (labelsValues.get(1) - minLabelValue))); else return labelsPos.get(index); } /* * -------- * Getters * -------- */ /** * Differentiates the inner left side of the chart depending if axis Y is drawn or not. * If drawing axis give it gives half of the line thickness as margin. * Inner Chart refers only to the area where chart data will be draw, * excluding labels, axis, etc. * * @return Position of the inner left side of the chart */ public float getInnerChartLeft(){ if(hasAxis) return axisHorPosition + chartView.style.axisThickness/2; else return axisHorPosition; } /** * Inner Chart refers only to the area where chart data will be draw, * excluding labels, axis, etc. * * @return Position of the inner left side of the chart */ public float getInnerChartBottom(){ return chartView.horController.getAxisVerticalPosition() - chartView.style.axisThickness/2; } /* * ---------------- * Abstract Methods * ---------------- */ @Override protected void draw(Canvas canvas){ if(hasAxis) // Draw axis line canvas.drawLine(axisHorPosition, chartView.chartTop, axisHorPosition, chartView.horController.getAxisVerticalPosition() + chartView.style.axisThickness/2, chartView.style.chartPaint); if(labelsPositioning != LabelPosition.NONE){ chartView.style.labelPaint.setTextAlign( (labelsPositioning == LabelPosition.OUTSIDE) ? Align.RIGHT : Align.LEFT); // Draw labels for(int i = 0; i < nLabels; i++){ canvas.drawText(labels.get(i), axisHorPosition - chartView.style.axisThickness/2 - distLabelToAxis, labelsPos.get(i) + getLabelHeight()/2, chartView.style.labelPaint); } } } }