diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/BarLineChartBase.java b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/BarLineChartBase.java index 41187c81be..273182c040 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/BarLineChartBase.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/BarLineChartBase.java @@ -212,15 +212,9 @@ protected void onDraw(Canvas canvas) { if (mXAxis.isEnabled()) mXAxisRenderer.computeAxis(mXAxis.mAxisMinimum, mXAxis.mAxisMaximum, false); - if (mXAxis.isDrawAxisLineBehindData()) { - mXAxisRenderer.renderAxisLine(canvas); - } - if (mAxisLeft.isDrawAxisLineBehindData()) { - mAxisRendererLeft.renderAxisLine(canvas); - } - if (mAxisRight.isDrawAxisLineBehindData()) { - mAxisRendererRight.renderAxisLine(canvas); - } + mXAxisRenderer.renderAxisLine(canvas); + mAxisRendererLeft.renderAxisLine(canvas); + mAxisRendererRight.renderAxisLine(canvas); if (mXAxis.isDrawGridLinesBehindDataEnabled()) mXAxisRenderer.renderGridLines(canvas); @@ -249,16 +243,6 @@ protected void onDraw(Canvas canvas) { mRenderer.drawData(canvas); - if (!mXAxis.isDrawAxisLineBehindData()) { - mXAxisRenderer.renderAxisLine(canvas); - } - if (!mAxisLeft.isDrawAxisLineBehindData()) { - mAxisRendererLeft.renderAxisLine(canvas); - } - if (!mAxisRight.isDrawAxisLineBehindData()) { - mAxisRendererRight.renderAxisLine(canvas); - } - if (!mXAxis.isDrawGridLinesBehindDataEnabled()) mXAxisRenderer.renderGridLines(canvas); diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/ElevationChart.java b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/ElevationChart.java deleted file mode 100644 index e17c69c664..0000000000 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/ElevationChart.java +++ /dev/null @@ -1,263 +0,0 @@ -package com.github.mikephil.charting.charts; - -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.Typeface; -import android.util.AttributeSet; - -import androidx.annotation.NonNull; - -import com.github.mikephil.charting.components.Legend; -import com.github.mikephil.charting.components.MarkerView; -import com.github.mikephil.charting.components.XAxis; -import com.github.mikephil.charting.components.YAxis; -import com.github.mikephil.charting.data.LineData; -import com.github.mikephil.charting.data.LineDataSet; -import com.github.mikephil.charting.interfaces.datasets.IOrderedLineDataSet; -import com.github.mikephil.charting.renderer.ElevationXAxisRenderer; -import com.github.mikephil.charting.renderer.ElevationYAxisRenderer; -import com.github.mikephil.charting.utils.Utils; - -import java.util.Iterator; - -public class ElevationChart extends LineChart { - private static final float PADDING_BETWEEN_LABELS_AND_CONTENT_DP = 6; - public static final float GRID_LINE_LENGTH_X_AXIS_DP = 8; - public static final float PADDING_BETWEEN_X_LABELS_AND_X_LINE = 1; - public static final int CHART_LABEL_COUNT = 3; - - private boolean showLastSet = true; - - public ElevationChart(Context context) { - super(context); - } - - public ElevationChart(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public ElevationChart(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - public void setShowLastSet(boolean shouldShowLastSet) { - this.showLastSet = shouldShowLastSet; - } - - public boolean shouldShowLastSet() { - return showLastSet; - } - - @Override - protected void init() { - super.init(); - setXAxisRenderer(new ElevationXAxisRenderer(this, getViewPortHandler(), getXAxis(), getTransformer(YAxis.AxisDependency.RIGHT))); - setRendererRightYAxis(new ElevationYAxisRenderer(this, mViewPortHandler, mAxisRight, mRightAxisTransformer)); - } - - @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) { - super.onSizeChanged(w, h, oldw, oldh); - updateDimens(w, h); - } - - public void updateDimens() { - updateDimens(getWidth(), getHeight()); - } - - @Override - public void notifyDataSetChanged() { - super.notifyDataSetChanged(); - updateDimens(); - } - - public void updateDimens(int width, int height) { - if (mData == null) { - return; - } - - float measureText = getMeasuredMaxLabel(); - Utils.init(getContext()); - mViewPortHandler.setChartDimens((float) width - measureText - Utils.dpToPx(getContext(), PADDING_BETWEEN_LABELS_AND_CONTENT_DP), (float) height); - - Iterator jobIterator = mJobs.iterator(); - while (jobIterator.hasNext()) { - Runnable r = (Runnable) jobIterator.next(); - post(r); - } - - mJobs.clear(); - } - - private float getMeasuredMaxLabel() { - int from = mAxisRight.isDrawBottomYLabelEntryEnabled() ? 0 : 1; - int to = mAxisRight.isDrawTopYLabelEntryEnabled() ? mAxisRight.mEntryCount : mAxisRight.mEntryCount - 1; - - LineData chartData = getLineData(); - int dataSetCount = chartData.getDataSetCount(); - LineDataSet lastDataSet = dataSetCount > 0 ? (LineDataSet) chartData.getDataSetByIndex(dataSetCount - 1) : null; - if (lastDataSet != null && !shouldShowLastSet()) { - dataSetCount--; - } - - Paint paint = mAxisRendererRight.getPaintAxisLabels(); - float maxMeasuredWidth = 0.0F; - - for (int i = from; i < to; ++i) { - float measuredLabelWidth = 0.0F; - String leftText; - if (dataSetCount == 1) { - leftText = getAxisLeft().getFormattedLabel(i); - if (lastDataSet instanceof IOrderedLineDataSet) { - leftText = ((IOrderedLineDataSet) lastDataSet).isLeftAxis() ? leftText : getAxisRight().getFormattedLabel(i); - } - measuredLabelWidth = paint.measureText(leftText); - } else { - leftText = getAxisLeft().getFormattedLabel(i) + ", "; - String rightText = getAxisRight().getFormattedLabel(i); - measuredLabelWidth = paint.measureText(leftText) + paint.measureText(rightText); - } - - if (measuredLabelWidth > maxMeasuredWidth) { - maxMeasuredWidth = measuredLabelWidth; - } - } - - return maxMeasuredWidth; - } - - @Override - protected void onDraw(Canvas canvas) { - if (mData != null) { - if (mAutoScaleMinMaxEnabled) { - prepareValuePxMatrix(); - autoScale(); - } - - if (mAxisRight.isEnabled()) { - mAxisRendererRight.computeAxis(mAxisRight.mAxisMinimum, mAxisRight.mAxisMaximum, mAxisRight.isInverted()); - } - - mAxisRendererLeft.computeAxis(mAxisLeft.mAxisMinimum, mAxisLeft.mAxisMaximum, mAxisLeft.isInverted()); - - if (mXAxis.isEnabled()) { - mXAxisRenderer.computeAxis(mXAxis.mAxisMinimum, mXAxis.mAxisMaximum, false); - } - - int clipRestoreCount = canvas.save(); - if (isClipDataToContentEnabled()) { - canvas.clipRect(mViewPortHandler.getContentRect()); - } - - mRenderer.drawData(canvas); - if (valuesToHighlight()) { - mRenderer.drawHighlighted(canvas, mIndicesToHighlight); - } - - canvas.restoreToCount(clipRestoreCount); - mRenderer.drawExtras(canvas); - if (mXAxis.isEnabled() && !mXAxis.isDrawLimitLinesBehindDataEnabled()) { - mXAxisRenderer.renderLimitLines(canvas); - } - - mXAxisRenderer.renderAxisLabels(canvas); - renderYAxisLabels(canvas); - if (isClipValuesToContentEnabled()) { - clipRestoreCount = canvas.save(); - canvas.clipRect(mViewPortHandler.getContentRect()); - mRenderer.drawValues(canvas); - canvas.restoreToCount(clipRestoreCount); - } else { - mRenderer.drawValues(canvas); - } - - mXAxisRenderer.renderGridLines(canvas); - mXAxisRenderer.renderAxisLine(canvas); - mAxisRendererRight.renderGridLines(canvas); - - mLegendRenderer.renderLegend(canvas); - drawDescription(canvas); - drawMarkers(canvas); - } - } - - @Override - protected void autoScale() { - final float fromX = getLowestVisibleX(); - final float toX = getHighestVisibleX(); - - mData.calcMinMaxY(fromX, toX); - mXAxis.calculate(mData.getXMin(), mData.getXMax()); - - mAxisLeft.calculate(mData.getYMin(YAxis.AxisDependency.LEFT), mData.getYMax(YAxis.AxisDependency.LEFT)); - mAxisRight.calculate(mData.getYMin(YAxis.AxisDependency.RIGHT), mData.getYMax(YAxis.AxisDependency.RIGHT)); - - calculateOffsets(); - } - - @Override - protected void renderYAxisLabels(@NonNull Canvas canvas) { - this.mAxisRendererRight.renderAxisLabels(canvas); - } - - public void setupGPXChart(@NonNull MarkerView markerView, float topOffset, float bottomOffset, int xAxisGridColor, int labelsColor, int yAxisGridColor, Typeface typeface, boolean useGesturesAndScale) { - Context context = getContext(); - - setExtraRightOffset(16.0F); - setExtraLeftOffset(16.0F); - setExtraTopOffset(topOffset); - setExtraBottomOffset(bottomOffset); - - setHardwareAccelerationEnabled(true); - setTouchEnabled(useGesturesAndScale); - setDragEnabled(useGesturesAndScale); - setScaleEnabled(useGesturesAndScale); - setPinchZoom(useGesturesAndScale); - setScaleYEnabled(false); - setAutoScaleMinMaxEnabled(true); - setDrawBorders(false); - getDescription().setEnabled(false); - setMaxVisibleValueCount(10); - setMinOffset(0.0F); - setDragDecelerationEnabled(false); - - markerView.setChartView(this); - setMarker(markerView); - setDrawMarkers(true); - XAxis xAxis = getXAxis(); - xAxis.setYOffset((GRID_LINE_LENGTH_X_AXIS_DP / 2) + PADDING_BETWEEN_X_LABELS_AND_X_LINE); - xAxis.setDrawAxisLine(true); - xAxis.setAxisLineWidth(1.0F); - xAxis.setAxisLineColor(xAxisGridColor); - xAxis.setDrawGridLines(true); - xAxis.setGridLineWidth(1.0F); - xAxis.setGridColor(xAxisGridColor); - xAxis.enableGridDashedLine(Utils.dpToPx(context, GRID_LINE_LENGTH_X_AXIS_DP), Float.MAX_VALUE, 0.0F); - xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); - xAxis.setTextColor(labelsColor); - xAxis.setAvoidFirstLastClipping(true); - - int dp4 = Utils.dpToPx(context, 4.0F); - - YAxis leftYAxis = getAxisLeft(); - leftYAxis.setLabelCount(CHART_LABEL_COUNT, true); - leftYAxis.setEnabled(false); - - YAxis rightYAxis = getAxisRight(); - rightYAxis.enableGridDashedLine(dp4, dp4, 0.0F); - rightYAxis.setGridColor(yAxisGridColor); - rightYAxis.setGridLineWidth(1.0F); - rightYAxis.setDrawBottomYGridLine(false); - rightYAxis.setDrawAxisLine(false); - rightYAxis.setPosition(YAxis.YAxisLabelPosition.INSIDE_CHART); - rightYAxis.setXOffset(-1.0F); - rightYAxis.setYOffset(10.25F); - rightYAxis.setTypeface(typeface); - rightYAxis.setTextSize(10.0F); - rightYAxis.setLabelCount(CHART_LABEL_COUNT, true); - - Legend legend = getLegend(); - legend.setEnabled(false); - } -} diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/GradientChart.java b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/GradientChart.java deleted file mode 100644 index e9b3c50d44..0000000000 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/GradientChart.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.github.mikephil.charting.charts; - -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.LinearGradient; -import android.graphics.Paint; -import android.graphics.Shader; -import android.util.AttributeSet; - -import com.github.mikephil.charting.components.YAxis; -import com.github.mikephil.charting.renderer.GradientXAxisRenderer; -import com.github.mikephil.charting.utils.Utils; - -import java.util.List; - -public class GradientChart extends LineChart { - private Paint paint; - - public GradientChart(Context context) { - super(context); - } - - public GradientChart(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public GradientChart(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - @Override - protected void init() { - super.init(); - setXAxisRenderer(new GradientXAxisRenderer(this, getViewPortHandler(), getXAxis(), getTransformer(YAxis.AxisDependency.RIGHT))); - } - - @Override - public void notifyDataSetChanged() { - super.notifyDataSetChanged(); - if (mData != null) { - List dataColors = mData.getDataSetByIndex(0).getColors(); - int[] colors = new int[dataColors.size()]; - for (int i = 0; i < colors.length; i++) { - colors[i] = dataColors.get(i); - } - LinearGradient linearGradient = new LinearGradient(mViewPortHandler.getContentRect().left, 0, mViewPortHandler.getContentRect().right, 0, colors, null, Shader.TileMode.CLAMP); - paint = new Paint(); - paint.setDither(true); - paint.setShader(linearGradient); - } - } - - @Override - public void calculateOffsets() { - if (!mCustomViewPortEnabled) { - float offsetLeft = 0f, offsetRight = 0f, offsetTop = 0f, offsetBottom = 0f; - - calculateLegendOffsets(mOffsetsBuffer); - - offsetLeft += mOffsetsBuffer.left; - offsetTop += mOffsetsBuffer.top; - offsetRight += mOffsetsBuffer.right; - offsetBottom += mOffsetsBuffer.bottom; - - offsetTop += getExtraTopOffset(); - offsetRight += getExtraRightOffset(); - offsetBottom += getExtraBottomOffset(); - offsetLeft += getExtraLeftOffset(); - - float minOffset = Utils.convertDpToPixel(mMinOffset); - - mViewPortHandler.restrainViewPort( - Math.max(minOffset, offsetLeft), - Math.max(minOffset, offsetTop), - Math.max(minOffset, offsetRight), - Math.max(minOffset, offsetBottom)); - } - - prepareOffsetMatrix(); - prepareValuePxMatrix(); - } - - @Override - protected void onDraw(Canvas canvas) { - if (mData != null) { - if (mAutoScaleMinMaxEnabled) { - autoScale(); - } - mXAxis.setEnabled(true); - - if (mXAxis.isEnabled()) { - mXAxisRenderer.computeAxis(mXAxis.mAxisMinimum, mXAxis.mAxisMaximum, false); - } - - int clipRestoreCount = canvas.save(); - if (isClipDataToContentEnabled()) { - canvas.clipRect(mViewPortHandler.getContentRect()); - } - - if (paint != null) { - canvas.drawRect(mViewPortHandler.getContentRect(), paint); - } - - canvas.restoreToCount(clipRestoreCount); - - mXAxisRenderer.renderAxisLabels(canvas); - if (isClipValuesToContentEnabled()) { - clipRestoreCount = canvas.save(); - canvas.clipRect(mViewPortHandler.getContentRect()); - mRenderer.drawValues(canvas); - canvas.restoreToCount(clipRestoreCount); - } else { - mRenderer.drawValues(canvas); - } - - mXAxisRenderer.renderGridLines(canvas); - mXAxisRenderer.renderAxisLine(canvas); - } - } -} diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/LineChart.java b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/LineChart.java index b8d1b13a63..aa7afc4c85 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/charts/LineChart.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/charts/LineChart.java @@ -2,24 +2,12 @@ package com.github.mikephil.charting.charts; import android.content.Context; -import android.graphics.Canvas; import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.FrameLayout; import com.github.mikephil.charting.data.LineData; import com.github.mikephil.charting.interfaces.dataprovider.LineDataProvider; import com.github.mikephil.charting.renderer.LineChartRenderer; -import java.lang.ref.WeakReference; - -import androidx.annotation.LayoutRes; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; - /** * Chart that draws lines, surfaces, circles, ... * @@ -27,10 +15,6 @@ */ public class LineChart extends BarLineChartBase implements LineDataProvider { - private static final boolean SHOW_LABELS_ON_START = true; - - private YAxisLabelView yAxisLabelView; - public LineChart(Context context) { super(context); } @@ -46,11 +30,8 @@ public LineChart(Context context, AttributeSet attrs, int defStyle) { @Override protected void init() { super.init(); - mRenderer = new LineChartRenderer(this, mAnimator, mViewPortHandler); - } - public void setYAxisLabelView(@Nullable YAxisLabelView labelView) { - yAxisLabelView = labelView; + mRenderer = new LineChartRenderer(this, mAnimator, mViewPortHandler); } @Override @@ -66,100 +47,4 @@ protected void onDetachedFromWindow() { } super.onDetachedFromWindow(); } - - @Override - protected void renderYAxisLabels(@NonNull Canvas canvas) { - - if (yAxisLabelView == null) { - super.renderYAxisLabels(canvas); - return; - } else if (!checkYAxisData()) { - return; - } - - float[] positions = mAxisRendererRight.getTransformedPositions(); - if (positions == null || positions.length == 0) { - return; - } - - for (int i = 0; i < mAxisLeft.mEntryCount; i++) { - yAxisLabelView.updateLabel(i); - yAxisLabelView.resizeLabel(); - float x = SHOW_LABELS_ON_START ? 0 : mViewPortHandler.contentRight() - yAxisLabelView.getWidth(); - boolean bottomLabel = mAxisLeft.mAxisMinimum == mAxisLeft.mEntries[i]; - float yOffset = bottomLabel ? yAxisLabelView.getHeight() : yAxisLabelView.getHeight() / 2f; - float y = positions[i * 2 + 1] - yOffset; - yAxisLabelView.draw(canvas, x, y); - } - } - - private boolean checkYAxisData() { - int enabledYAxis = 0; - if (mAxisLeft.isEnabled() && mAxisLeft.isDrawLabelsEnabled()) { - enabledYAxis++; - } - if (mAxisRight.isEnabled() && mAxisRight.isDrawLabelsEnabled()) { - enabledYAxis++; - } - return mData != null && mData.getDataSetCount() >= enabledYAxis; - } - - public abstract static class YAxisLabelView extends FrameLayout { - - private WeakReference chartRef; - - public YAxisLabelView(@NonNull Context context, @LayoutRes int layoutId) { - super(context); - inflate(layoutId); - } - - public YAxisLabelView(@NonNull Context context, @Nullable AttributeSet attrs, @LayoutRes int layoutId) { - super(context, attrs); - inflate(layoutId); - } - - public YAxisLabelView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, - @LayoutRes int layoutId) { - super(context, attrs, defStyleAttr); - inflate(layoutId); - } - - public YAxisLabelView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, - int defStyleRes, @LayoutRes int layoutId) { - super(context, attrs, defStyleAttr, defStyleRes); - inflate(layoutId); - } - - private void inflate(@LayoutRes int layoutId) { - View view = LayoutInflater.from(getContext()).inflate(layoutId, this); - view.setLayoutParams(new FrameLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT)); - view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), - MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); - view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); - } - - public abstract void updateLabel(int labelIndex); - - private void resizeLabel() { - measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), - MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); - layout(0, 0, getMeasuredWidth(), getMeasuredHeight()); - } - - public void draw(@NonNull Canvas canvas, float posX, float posY) { - int saveId = canvas.save(); - canvas.translate(posX, posY); - draw(canvas); - canvas.restoreToCount(saveId); - } - - @Nullable - public LineChart getChart() { - return chartRef != null ? chartRef.get() : null; - } - - public void setChart(@NonNull LineChart chart) { - chartRef = new WeakReference<>(chart); - } - } } diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/components/AxisBase.java b/MPChartLib/src/main/java/com/github/mikephil/charting/components/AxisBase.java index 84b300a5c9..c90b4fc9b9 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/components/AxisBase.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/components/AxisBase.java @@ -117,8 +117,6 @@ public abstract class AxisBase extends ComponentBase { */ protected boolean mDrawGridLinesBehindData = true; - protected boolean mDrawAxisLineBehindData = true; - /** * Extra spacing for `axisMinimum` to be added to automatically calculated `axisMinimum` */ @@ -496,14 +494,6 @@ public boolean isDrawGridLinesBehindDataEnabled() { return mDrawGridLinesBehindData; } - public void setDrawAxisLineBehindData(boolean enabled) { - mDrawAxisLineBehindData = enabled; - } - - public boolean isDrawAxisLineBehindData() { - return mDrawAxisLineBehindData; - } - /** * Returns the longest formatted label (in terms of characters), this axis * contains. diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/components/YAxis.java b/MPChartLib/src/main/java/com/github/mikephil/charting/components/YAxis.java index 44e65355fe..d2071ec5a8 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/components/YAxis.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/components/YAxis.java @@ -28,8 +28,6 @@ public class YAxis extends AxisBase { */ private boolean mDrawTopYLabelEntry = true; - private boolean mDrawBottomYGridLine = true; - /** * flag that indicates if the axis is inverted or not */ @@ -215,15 +213,6 @@ public boolean isDrawBottomYLabelEntryEnabled() { return mDrawBottomYLabelEntry; } - public boolean isDrawBottomYGridLine() { - return mDrawBottomYGridLine; - } - - public void setDrawBottomYGridLine(boolean enabled) { - mDrawBottomYGridLine = enabled; - } - - /** * set this to true to enable drawing the top y-label entry. Disabling this can be helpful * when the top y-label and diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/interfaces/datasets/IOrderedLineDataSet.java b/MPChartLib/src/main/java/com/github/mikephil/charting/interfaces/datasets/IOrderedLineDataSet.java deleted file mode 100644 index 0f6de15194..0000000000 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/interfaces/datasets/IOrderedLineDataSet.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.github.mikephil.charting.interfaces.datasets; - -public interface IOrderedLineDataSet { - boolean isLeftAxis(); -} diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/AxisRenderer.java b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/AxisRenderer.java index c7036c78f4..1654a39cba 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/AxisRenderer.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/AxisRenderer.java @@ -147,137 +147,139 @@ public void computeAxis(float min, float max, boolean inverted) { * * @return */ - protected void computeAxisValues(float min, float max) { - float yMin = min; - float yMax = max; - - int labelCount = mAxis.getLabelCount(); - double range = Math.abs(yMax - yMin); - - if (labelCount == 0 || range <= 0 || Double.isInfinite(range)) { - mAxis.mEntries = new float[]{}; - mAxis.mCenteredEntries = new float[]{}; - mAxis.mEntryCount = 0; - return; - } - - // Find out how much spacing (in y value space) between axis values - double interval = calculateInterval(range, labelCount); - - int calculatedLabelsCount = mAxis.isCenterAxisLabelsEnabled() ? 1 : 0; - - Pair result = calculateLabelsCountAndInterval(calculatedLabelsCount, interval, yMin, yMax, range, labelCount); - interval = result.first; - calculatedLabelsCount = result.second; - - // set decimals - if (interval < 1) { - mAxis.mDecimals = (int) Math.ceil(-Math.log10(interval)); - } else { - mAxis.mDecimals = 0; - } - - if (mAxis.isCenterAxisLabelsEnabled()) { - - if (mAxis.mCenteredEntries.length < calculatedLabelsCount) { - mAxis.mCenteredEntries = new float[calculatedLabelsCount]; - } - - float offset = (float) interval / 2f; - - for (int i = 0; i < calculatedLabelsCount; i++) { - mAxis.mCenteredEntries[i] = mAxis.mEntries[i] + offset; - } - } - } - - protected Pair calculateLabelsCountAndInterval(int newLabelsCount, double interval, float yMin, float yMax, double range, int labelCount) { - Pair result; - // force label count - if (mAxis.isForceLabelsEnabled()) { - result = calculateForcedLabelCount(range, labelCount, yMin); - // no forced count - } else { - result = calculateNoForcedLabelCount(interval, newLabelsCount, yMin, yMax); - } - return result; - } - - protected double calculateInterval(double range, int labelCount) { - double rawInterval = range / labelCount; - double interval = Utils.roundToNextSignificant(rawInterval); - // If granularity is enabled, then do not allow the interval to go below specified granularity. - // This is used to avoid repeated values when rounding values for display. - if (mAxis.isGranularityEnabled()) - interval = interval < mAxis.getGranularity() ? mAxis.getGranularity() : interval; - - // Normalize interval - double intervalMagnitude = Utils.roundToNextSignificant(Math.pow(10, (int) Math.log10(interval))); - int intervalSigDigit = (int) (interval / intervalMagnitude); - if (intervalSigDigit > 5) { - // Use one order of magnitude higher, to avoid intervals like 0.9 or 90 - // if it's 0.0 after floor(), we use the old value - interval = Math.floor(10.0 * intervalMagnitude) == 0.0 - ? interval - : Math.floor(10.0 * intervalMagnitude); - - } - return interval; - } - - protected Pair calculateNoForcedLabelCount(double interval, int n, float yMin, float yMax) { - double first = interval == 0.0 ? 0.0 : Math.ceil(yMin / interval) * interval; - if (mAxis.isCenterAxisLabelsEnabled()) { - first -= interval; - } - - double last = interval == 0.0 ? 0.0 : Utils.nextUp(Math.floor(yMax / interval) * interval); - - double f; - int i; - - if (interval != 0.0 && last != first) { - for (f = first; f <= last; f += interval) { - ++n; - } - } else if (last == first && n == 0) { - n = 1; - } - - mAxis.mEntryCount = n; - - if (mAxis.mEntries.length < n) { - // Ensure stops contains at least numStops elements. - mAxis.mEntries = new float[n]; - } - - for (f = first, i = 0; i < n; f += interval, ++i) { - - if (f == 0.0) // Fix for negative zero case (Where value == -0.0, and 0.0 == -0.0) - f = 0.0; - - mAxis.mEntries[i] = (float) f; - } - return new Pair<>(interval, n); - } - - protected Pair calculateForcedLabelCount(double range, int labelCount, float min) { - double interval = (float) range / (float) (labelCount - 1); - mAxis.mEntryCount = labelCount; - - if (mAxis.mEntries.length < labelCount) { - // Ensure stops contains at least numStops elements. - mAxis.mEntries = new float[labelCount]; - } - - float v = min; - - for (int i = 0; i < labelCount; i++) { - mAxis.mEntries[i] = v; - v += interval; - } - return new Pair<>(interval, labelCount); - } + protected void computeAxisValues(float min, float max) { + + float yMin = min; + float yMax = max; + + int labelCount = mAxis.getLabelCount(); + double range = Math.abs(yMax - yMin); + + if (labelCount == 0 || range <= 0 || Double.isInfinite(range)) { + mAxis.mEntries = new float[]{}; + mAxis.mCenteredEntries = new float[]{}; + mAxis.mEntryCount = 0; + return; + } + + // Find out how much spacing (in y value space) between axis values + double interval = calculateInterval(range, labelCount); + + int calculatedLabelsCount = mAxis.isCenterAxisLabelsEnabled() ? 1 : 0; + + Pair result = calculateLabelsCountAndInterval(calculatedLabelsCount, interval, yMin, yMax, range, labelCount); + interval = result.first; + calculatedLabelsCount = result.second; + + // set decimals + if (interval < 1) { + mAxis.mDecimals = (int) Math.ceil(-Math.log10(interval)); + } else { + mAxis.mDecimals = 0; + } + + if (mAxis.isCenterAxisLabelsEnabled()) { + + if (mAxis.mCenteredEntries.length < calculatedLabelsCount) { + mAxis.mCenteredEntries = new float[calculatedLabelsCount]; + } + + float offset = (float) interval / 2f; + + for (int i = 0; i < calculatedLabelsCount; i++) { + mAxis.mCenteredEntries[i] = mAxis.mEntries[i] + offset; + } + } + } + + protected Pair calculateLabelsCountAndInterval(int newLabelsCount, double interval, float yMin, float yMax, double range, int labelCount) { + Pair result; + // force label count + if (mAxis.isForceLabelsEnabled()) { + result = calculateForcedLabelCount(range, labelCount, yMin); + // no forced count + } else { + result = calculateNoForcedLabelCount(interval, newLabelsCount, yMin, yMax); + } + return result; + } + + protected double calculateInterval(double range, int labelCount) { + double rawInterval = range / labelCount; + double interval = Utils.roundToNextSignificant(rawInterval); + + // If granularity is enabled, then do not allow the interval to go below specified granularity. + // This is used to avoid repeated values when rounding values for display. + if (mAxis.isGranularityEnabled()) + interval = interval < mAxis.getGranularity() ? mAxis.getGranularity() : interval; + + // Normalize interval + double intervalMagnitude = Utils.roundToNextSignificant(Math.pow(10, (int) Math.log10(interval))); + int intervalSigDigit = (int) (interval / intervalMagnitude); + if (intervalSigDigit > 5) { + // Use one order of magnitude higher, to avoid intervals like 0.9 or 90 + // if it's 0.0 after floor(), we use the old value + interval = Math.floor(10.0 * intervalMagnitude) == 0.0 + ? interval + : Math.floor(10.0 * intervalMagnitude); + + } + return interval; + } + + protected Pair calculateNoForcedLabelCount(double interval, int n, float yMin, float yMax) { + double first = interval == 0.0 ? 0.0 : Math.ceil(yMin / interval) * interval; + if (mAxis.isCenterAxisLabelsEnabled()) { + first -= interval; + } + + double last = interval == 0.0 ? 0.0 : Utils.nextUp(Math.floor(yMax / interval) * interval); + + double f; + int i; + + if (interval != 0.0 && last != first) { + for (f = first; f <= last; f += interval) { + ++n; + } + } else if (last == first && n == 0) { + n = 1; + } + + mAxis.mEntryCount = n; + + if (mAxis.mEntries.length < n) { + // Ensure stops contains at least numStops elements. + mAxis.mEntries = new float[n]; + } + + for (f = first, i = 0; i < n; f += interval, ++i) { + + if (f == 0.0) // Fix for negative zero case (Where value == -0.0, and 0.0 == -0.0) + f = 0.0; + + mAxis.mEntries[i] = (float) f; + } + return new Pair<>(interval, n); + } + + protected Pair calculateForcedLabelCount(double range, int labelCount, float min) { + double interval = (float) range / (float) (labelCount - 1); + mAxis.mEntryCount = labelCount; + + if (mAxis.mEntries.length < labelCount) { + // Ensure stops contains at least numStops elements. + mAxis.mEntries = new float[labelCount]; + } + + float v = min; + + for (int i = 0; i < labelCount; i++) { + mAxis.mEntries[i] = v; + v += interval; + } + return new Pair<>(interval, labelCount); + } /** * Draws the axis labels to the screen. diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/ElevationXAxisRenderer.java b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/ElevationXAxisRenderer.java deleted file mode 100644 index 23cae46e0a..0000000000 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/ElevationXAxisRenderer.java +++ /dev/null @@ -1,182 +0,0 @@ -package com.github.mikephil.charting.renderer; - -import static com.github.mikephil.charting.charts.ElevationChart.GRID_LINE_LENGTH_X_AXIS_DP; - -import android.graphics.Canvas; -import android.graphics.Path; -import android.graphics.RectF; -import android.util.Pair; - -import com.github.mikephil.charting.charts.ElevationChart; -import com.github.mikephil.charting.charts.LineChart; -import com.github.mikephil.charting.components.XAxis; -import com.github.mikephil.charting.utils.MPPointF; -import com.github.mikephil.charting.utils.Transformer; -import com.github.mikephil.charting.utils.Utils; -import com.github.mikephil.charting.utils.ViewPortHandler; - -public class ElevationXAxisRenderer extends XAxisRenderer { - private final LineChart mChart; - - public ElevationXAxisRenderer(LineChart mChart, ViewPortHandler viewPortHandler, XAxis xAxis, Transformer trans) { - super(viewPortHandler, xAxis, trans); - this.mChart = mChart; - } - - @Override - public RectF getGridClippingRect() { - RectF rectF = new RectF(mViewPortHandler.contentLeft(), mViewPortHandler.contentTop(), mViewPortHandler.contentRight(), mViewPortHandler.contentBottom() + Utils.dpToPx(mChart.getContext(), GRID_LINE_LENGTH_X_AXIS_DP / 2)); - mGridClippingRect.set(mViewPortHandler.getContentRect()); - mGridClippingRect.inset(-mAxis.getGridLineWidth(), 0.0F); - return rectF; - } - - @Override - public void renderAxisLine(Canvas c) { - if (mXAxis.isDrawAxisLineEnabled() && mXAxis.isEnabled()) { - mAxisLinePaint.setColor(mXAxis.getAxisLineColor()); - mAxisLinePaint.setStrokeWidth(mXAxis.getAxisLineWidth()); - mAxisLinePaint.setPathEffect(mXAxis.getAxisLineDashPathEffect()); - - c.drawLine(mChart.getExtraLeftOffset(), mViewPortHandler.contentBottom(), c.getWidth() - mChart.getExtraRightOffset(), mViewPortHandler.contentBottom(), mAxisLinePaint); - } - } - - @Override - protected void drawGridLine(Canvas c, float x, float y, Path gridLinePath) { - gridLinePath.moveTo(x, mViewPortHandler.contentBottom() + Utils.dpToPx(mChart.getContext(), GRID_LINE_LENGTH_X_AXIS_DP / 2)); - gridLinePath.lineTo(x, mViewPortHandler.contentTop()); - c.drawPath(gridLinePath, mGridPaint); - gridLinePath.reset(); - } - - @Override - protected void drawLabels(Canvas c, float pos, MPPointF anchor) { - float labelRotationAngleDegrees = mXAxis.getLabelRotationAngle(); - boolean centeringEnabled = mXAxis.isCenterAxisLabelsEnabled(); - float[] positions = new float[mXAxis.mEntryCount * 2]; - int i; - for (i = 0; i < positions.length; i += 2) { - if (centeringEnabled) { - positions[i] = mXAxis.mCenteredEntries[i / 2]; - } else { - positions[i] = mXAxis.mEntries[i / 2]; - } - } - - this.mTrans.pointValuesToPixel(positions); - - for (i = 0; i < positions.length; i += 2) { - float x = positions[i]; - if (mViewPortHandler.isInBoundsX(x)) { - String label = mXAxis.getValueFormatter().getFormattedValue(mXAxis.mEntries[i / 2], mXAxis); - if (mXAxis.isAvoidFirstLastClippingEnabled()) { - float width; - if (i / 2 == mXAxis.mEntryCount - 1 && mXAxis.mEntryCount > 1) { - width = Utils.calcTextWidth(mAxisLabelPaint, label); - int labelEndPosition = (int) (x + (width / 2)); - if (!mViewPortHandler.isInBoundsX(labelEndPosition)) { - x = mViewPortHandler.contentRight() - (width / 2); - } - } else if (i == 0) { - width = Utils.calcTextWidth(mAxisLabelPaint, label); - int labelStartPosition = (int) (x - (width / 2)); - if (!mViewPortHandler.isInBoundsX(labelStartPosition)) { - x = mViewPortHandler.contentLeft() + (width / 2); - } - } - } - drawLabel(c, label, x, pos, anchor, labelRotationAngleDegrees); - } - } - } - - @Override - protected double calculateInterval(double range, int labelCount) { - int labelCountForFullInterval = labelCount - 1; - double interval = range / labelCountForFullInterval; - if (mAxis.isGranularityEnabled()) - interval = interval < mAxis.getGranularity() ? mAxis.getGranularity() : interval; - - double intervalMagnitude = Utils.roundToNextSignificant(Math.pow(10, (int) Math.log10(interval))); - int intervalSigDigit = (int) (interval / intervalMagnitude); - if (intervalSigDigit > 5) { - interval = Math.floor(10.0 * intervalMagnitude) == 0.0 - ? interval - : Math.floor(10.0 * intervalMagnitude); - - } - return interval; - } - - @Override - protected Pair calculateNoForcedLabelCount(double interval, int n, float yMin, float yMax) { - double first = interval == 0.0 ? 0.0 : Math.ceil(yMin / interval) * interval; - if (mAxis.isCenterAxisLabelsEnabled()) { - first -= interval; - } - - double last = interval == 0.0 ? 0.0 : yMax; - - double f; - int i; - - if (interval != 0.0 && last != first) { - for (f = first; f <= last; f += interval) { - ++n; - } - } else if (last == first && n == 0) { - n = 1; - } - - mAxis.mEntryCount = n; - - if (mAxis.mEntries.length < n) { - // Ensure stops contains at least numStops elements. - mAxis.mEntries = new float[n]; - } - - for (f = first, i = 0; i < n; f += interval, ++i) { - - if (f == 0.0) // Fix for negative zero case (Where value == -0.0, and 0.0 == -0.0) - f = 0.0; - - mAxis.mEntries[i] = (float) f; - } - return new Pair<>(interval, n); - } - - @Override - public void renderGridLines(Canvas c) { - if (mXAxis.isDrawGridLinesEnabled() && mXAxis.isEnabled()) { - int clipRestoreCount = c.save(); - c.clipRect(getGridClippingRect()); - if (mRenderGridLinesBuffer.length != mAxis.mEntryCount * 2) { - mRenderGridLinesBuffer = new float[mXAxis.mEntryCount * 2]; - } - - float[] positions = mRenderGridLinesBuffer; - - for (int i = 0; i < positions.length; i += 2) { - positions[i] = mXAxis.mEntries[i / 2]; - positions[i + 1] = mXAxis.mEntries[i / 2]; - } - - mTrans.pointValuesToPixel(positions); - setupGridPaint(); - Path gridLinePath = mRenderGridLinesPath; - gridLinePath.reset(); - - for (int i = 0; i < positions.length; i += 2) { - float x = positions[i]; - if (i / 2 == mXAxis.mEntryCount - 1 && mXAxis.mEntryCount > 1) { - x = x - mXAxis.getGridLineWidth() / 2; - } else if (i == 0) { - x = x + mXAxis.getGridLineWidth() / 2; - } - drawGridLine(c, x, positions[i + 1], gridLinePath); - } - c.restoreToCount(clipRestoreCount); - } - } -} diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/ElevationYAxisRenderer.java b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/ElevationYAxisRenderer.java deleted file mode 100644 index e3e7ef91a3..0000000000 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/ElevationYAxisRenderer.java +++ /dev/null @@ -1,171 +0,0 @@ -package com.github.mikephil.charting.renderer; - -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.Path; -import android.graphics.RectF; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.github.mikephil.charting.charts.ElevationChart; -import com.github.mikephil.charting.components.YAxis; -import com.github.mikephil.charting.data.LineData; -import com.github.mikephil.charting.data.LineDataSet; -import com.github.mikephil.charting.interfaces.datasets.ILineDataSet; -import com.github.mikephil.charting.interfaces.datasets.IOrderedLineDataSet; -import com.github.mikephil.charting.utils.Transformer; -import com.github.mikephil.charting.utils.Utils; -import com.github.mikephil.charting.utils.ViewPortHandler; - -public class ElevationYAxisRenderer extends YAxisRenderer { - private final ElevationChart mChart; - - public ElevationYAxisRenderer(ElevationChart mChart, ViewPortHandler viewPortHandler, YAxis yAxis, Transformer trans) { - super(viewPortHandler, yAxis, trans); - this.mChart = mChart; - } - - @Override - public void renderAxisLabels(Canvas c) { - if (mYAxis.isEnabled() && mYAxis.isDrawLabelsEnabled()) { - float[] positions = getTransformedPositions(); - mAxisLabelPaint.setTypeface(mYAxis.getTypeface()); - mAxisLabelPaint.setTextSize(mYAxis.getTextSize()); - mAxisLabelPaint.setColor(mYAxis.getTextColor()); - float xoffset = mYAxis.getXOffset(); - float yoffset = (float) Utils.calcTextHeight(mAxisLabelPaint, "A") / 2.5F + mYAxis.getYOffset(); - YAxis.AxisDependency dependency = mYAxis.getAxisDependency(); - YAxis.YAxisLabelPosition labelPosition = mYAxis.getLabelPosition(); - float xPos = 0.0F; - if (dependency == YAxis.AxisDependency.LEFT) { - if (labelPosition == YAxis.YAxisLabelPosition.OUTSIDE_CHART) { - mAxisLabelPaint.setTextAlign(Paint.Align.RIGHT); - xPos = mViewPortHandler.offsetLeft() - xoffset; - } else { - mAxisLabelPaint.setTextAlign(Paint.Align.LEFT); - xPos = mViewPortHandler.offsetLeft() + xoffset; - } - } else if (labelPosition == YAxis.YAxisLabelPosition.OUTSIDE_CHART) { - mAxisLabelPaint.setTextAlign(Paint.Align.LEFT); - xPos = mViewPortHandler.contentRight() + xoffset; - } else { - mAxisLabelPaint.setTextAlign(Paint.Align.RIGHT); - xPos = c.getWidth() - mChart.getExtraRightOffset() - xoffset; - } - - drawYLabels(c, xPos, positions, yoffset); - } - } - - @Override - protected void drawYLabels(Canvas c, float fixedPosition, float[] positions, float offset) { - int from = mYAxis.isDrawBottomYLabelEntryEnabled() ? 0 : 1; - int to = mYAxis.isDrawTopYLabelEntryEnabled() ? mYAxis.mEntryCount : mYAxis.mEntryCount - 1; - float xOffset = mYAxis.getLabelXOffset(); - - LineData chartData = mChart.getLineData(); - int dataSetCount = chartData.getDataSetCount(); - LineDataSet lastDataSet = dataSetCount > 0 ? (LineDataSet) chartData.getDataSetByIndex(dataSetCount - 1) : null; - if (lastDataSet != null && !mChart.shouldShowLastSet()) { - dataSetCount--; - } - - for (int i = from; i < to; ++i) { - String leftText; - if (dataSetCount == 1) { - leftText = this.mChart.getAxisLeft().getFormattedLabel(i); - if (lastDataSet instanceof IOrderedLineDataSet) { - leftText = ((IOrderedLineDataSet) lastDataSet).isLeftAxis() ? leftText : mChart.getAxisRight().getFormattedLabel(i); - } - int color = ((ILineDataSet) chartData.getDataSetByIndex(0)).getColor(); - mAxisLabelPaint.setColor(color); - c.drawText(leftText, fixedPosition + xOffset, positions[i * 2 + 1] + offset, mAxisLabelPaint); - } else { - leftText = mChart.getAxisLeft().getFormattedLabel(i) + ", "; - String rightText = mChart.getAxisRight().getFormattedLabel(i); - ILineDataSet startDataSet = getDataSet(chartData, true); - ILineDataSet endDataSet = getDataSet(chartData, false); - float rightTextWidth = mAxisLabelPaint.measureText(rightText); - if (startDataSet != null && endDataSet != null) { - int leftTextColor = startDataSet.getColor(); - int rightTextColor = endDataSet.getColor(); - if (startDataSet instanceof IOrderedLineDataSet) { - if (((IOrderedLineDataSet) startDataSet).isLeftAxis()) { - leftTextColor = startDataSet.getColor(); - rightTextColor = endDataSet.getColor(); - } else { - leftTextColor = endDataSet.getColor(); - rightTextColor = startDataSet.getColor(); - } - } - mAxisLabelPaint.setColor(rightTextColor); - c.drawText(rightText, fixedPosition + xOffset, positions[i * 2 + 1] + offset, mAxisLabelPaint); - mAxisLabelPaint.setColor(leftTextColor); - c.drawText(leftText, fixedPosition + xOffset - rightTextWidth, positions[i * 2 + 1] + offset, mAxisLabelPaint); - } else { - c.drawText(rightText, fixedPosition + xOffset, positions[i * 2 + 1] + offset, mAxisLabelPaint); - c.drawText(leftText, fixedPosition + xOffset - rightTextWidth, positions[i * 2 + 1] + offset, mAxisLabelPaint); - } - } - } - } - - @Nullable - private ILineDataSet getDataSet(@NonNull LineData lineData, boolean firstSet) { - if (lineData.getDataSets().size() == 1) { - return lineData.getDataSetByIndex(0); - } else if (lineData.getDataSets().size() > 1) { - return lineData.getDataSetByIndex(firstSet ? 0 : 1); - } - return null; - } - - @Override - public RectF getGridClippingRect() { - RectF rectF = new RectF(mChart.getExtraLeftOffset(), mChart.getExtraTopOffset(), mChart.getWidth() - mChart.getExtraRightOffset(), mChart.getHeight() - mChart.getExtraBottomOffset()); - mGridClippingRect.set(rectF); - mGridClippingRect.inset(0.0F, -mAxis.getGridLineWidth()); - return mGridClippingRect; - } - - @Override - public void renderGridLines(Canvas c) { - if (mYAxis.isEnabled()) { - if (mYAxis.isDrawGridLinesEnabled()) { - float[] positions = getTransformedPositions(); - mGridPaint.setColor(mYAxis.getGridColor()); - mGridPaint.setStrokeWidth(mYAxis.getGridLineWidth()); - mGridPaint.setPathEffect(mYAxis.getGridDashPathEffect()); - Path gridLinePath = mRenderGridLinesPath; - gridLinePath.reset(); - int start = mYAxis.isDrawBottomYGridLine() ? 0 : 2; - - for (int i = start; i < positions.length; i += 2) { - c.drawPath(linePath(gridLinePath, i, positions), mGridPaint); - gridLinePath.reset(); - } - } - - if (mYAxis.isDrawZeroLineEnabled()) { - drawZeroLine(c); - } - } - } - - @Override - protected Path linePath(Path p, int i, float[] positions) { - float y = positions[i + 1]; - float correctedY = y; - float paintWidth = mGridPaint.getStrokeWidth(); - if (y + paintWidth > mViewPortHandler.contentBottom()) { - correctedY = mViewPortHandler.contentBottom() - paintWidth; - } else if (y - paintWidth < mViewPortHandler.contentTop()) { - correctedY = mViewPortHandler.contentTop() + paintWidth; - } - - p.moveTo(mChart.getExtraLeftOffset(), correctedY); - p.lineTo(mChart.getWidth() - mChart.getExtraRightOffset(), correctedY); - return p; - } -} diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/GradientXAxisRenderer.java b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/GradientXAxisRenderer.java deleted file mode 100644 index 3a1db27c55..0000000000 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/GradientXAxisRenderer.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.github.mikephil.charting.renderer; - -import android.graphics.Canvas; -import android.graphics.Path; - -import com.github.mikephil.charting.charts.GradientChart; -import com.github.mikephil.charting.components.XAxis; -import com.github.mikephil.charting.data.DataSet; -import com.github.mikephil.charting.data.Entry; -import com.github.mikephil.charting.utils.MPPointF; -import com.github.mikephil.charting.utils.Transformer; -import com.github.mikephil.charting.utils.Utils; -import com.github.mikephil.charting.utils.ViewPortHandler; - -public class GradientXAxisRenderer extends ElevationXAxisRenderer { - private final GradientChart mChart; - - public GradientXAxisRenderer(GradientChart mChart, ViewPortHandler viewPortHandler, XAxis xAxis, Transformer trans) { - super(mChart, viewPortHandler, xAxis, trans); - this.mChart = mChart; - } - - @Override - protected void drawLabels(Canvas c, float pos, MPPointF anchor) { - float labelRotationAngleDegrees = mXAxis.getLabelRotationAngle(); - float splitInterval = (mXAxis.mAxisMaximum - mXAxis.mAxisMinimum) / (float) (mXAxis.mEntryCount - 1); - float[] positions = new float[mXAxis.mEntryCount * 2]; - for (int i = 0; i < positions.length; i += 2) { - positions[i] = mXAxis.mAxisMinimum + ((float) (i / 2) * splitInterval); - } - - this.mTrans.pointValuesToPixel(positions); - - for (int i = 0; i < positions.length; i += 2) { - float x = positions[i]; - if (mViewPortHandler.isInBoundsX(x)) { - String label = mXAxis.getValueFormatter().getFormattedValue(mXAxis.mEntries[i / 2], mXAxis); - if (mXAxis.isAvoidFirstLastClippingEnabled()) { - float width; - if (i / 2 == mXAxis.mEntryCount - 1 && mXAxis.mEntryCount > 1) { - width = Utils.calcTextWidth(mAxisLabelPaint, label); - x -= width / 2.0F; - } else if (i == 0) { - width = Utils.calcTextWidth(mAxisLabelPaint, label); - x += width / 2.0F; - } - } - drawLabel(c, label, x, pos, anchor, labelRotationAngleDegrees); - } - } - } - - @Override - protected void computeAxisValues(float min, float max) { - float yMin = min; - float yMax = max; - if (mChart.getLineData() != null) { - DataSet dataSet = (DataSet) mChart.getLineData().getDataSetByIndex(0); - int labelCount = dataSet.getEntries().size(); - double range = Math.abs(yMax - yMin); - - if (labelCount == 0 || range <= 0 || Double.isInfinite(range)) { - mAxis.mEntries = new float[]{}; - mAxis.mCenteredEntries = new float[]{}; - mAxis.mEntryCount = 0; - return; - } - - mAxis.mEntryCount = labelCount; - mAxis.mEntries = new float[labelCount]; - mAxis.mCenteredEntries = new float[labelCount]; - for (int i = 0; i < dataSet.getEntries().size(); i++) { - Entry entry = (Entry) dataSet.getEntries().get(i); - mAxis.mEntries[i] = entry.getX(); - mAxis.mCenteredEntries[i] = entry.getX(); - } - } - computeSize(); - } - - @Override - public void renderGridLines(Canvas c) { - if (mXAxis.isDrawGridLinesEnabled() && mXAxis.isEnabled()) { - int clipRestoreCount = c.save(); - c.clipRect(getGridClippingRect()); - float splitInterval = (mXAxis.mAxisMaximum - mXAxis.mAxisMinimum) / (float) (mXAxis.mEntryCount - 1); - float[] positions = new float[mXAxis.mEntryCount * 2]; - for (int i = 0; i < positions.length; i += 2) { - positions[i] = mXAxis.mAxisMinimum + ((float) (i / 2) * splitInterval); - } - - mTrans.pointValuesToPixel(positions); - setupGridPaint(); - Path gridLinePath = mRenderGridLinesPath; - gridLinePath.reset(); - - for (int i = 0; i < positions.length; i += 2) { - float x = positions[i]; - if (i / 2 == mXAxis.mEntryCount - 1 && mXAxis.mEntryCount > 1) { - x = x - mXAxis.getGridLineWidth() / 2; - } else if (i == 0) { - x = x + mXAxis.getGridLineWidth() / 2; - } - drawGridLine(c, x, positions[i + 1], gridLinePath); - } - c.restoreToCount(clipRestoreCount); - } - } -} diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/YAxisRenderer.java b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/YAxisRenderer.java index 0464a101af..53cca7ee03 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/YAxisRenderer.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/YAxisRenderer.java @@ -17,7 +17,6 @@ import com.github.mikephil.charting.utils.ViewPortHandler; import java.util.List; -import java.util.Map; public class YAxisRenderer extends AxisRenderer { @@ -155,9 +154,8 @@ public void renderGridLines(Canvas c) { Path gridLinePath = mRenderGridLinesPath; gridLinePath.reset(); - int start = mYAxis.isDrawBottomYGridLine() ? 0 : 2; // draw the grid - for (int i = start; i < positions.length; i += 2) { + for (int i = 0; i < positions.length; i += 2) { // draw a path because lines don't support dashing on lower android versions c.drawPath(linePath(gridLinePath, i, positions), mGridPaint); @@ -189,17 +187,9 @@ public RectF getGridClippingRect() { * @return */ protected Path linePath(Path p, int i, float[] positions) { - float y = positions[i + 1]; - float correctedY = y; - float paintWidth = mGridPaint.getStrokeWidth(); - if (y + paintWidth > mViewPortHandler.contentBottom()) { - correctedY = mViewPortHandler.contentBottom() - paintWidth; - } else if (y - paintWidth < mViewPortHandler.contentTop()) { - correctedY = mViewPortHandler.contentTop() + paintWidth; - } - p.moveTo(mViewPortHandler.offsetLeft(), correctedY); - p.lineTo(mViewPortHandler.contentRight(), correctedY); + p.moveTo(mViewPortHandler.offsetLeft(), positions[i + 1]); + p.lineTo(mViewPortHandler.contentRight(), positions[i + 1]); return p; } @@ -211,7 +201,7 @@ protected Path linePath(Path p, int i, float[] positions) { * * @return */ - public float[] getTransformedPositions() { + protected float[] getTransformedPositions() { if(mGetTransformedPositionsBuffer.length != mYAxis.mEntryCount * 2){ mGetTransformedPositionsBuffer = new float[mYAxis.mEntryCount * 2]; diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/YAxisRendererHorizontalBarChart.java b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/YAxisRendererHorizontalBarChart.java index 6269f6f955..fedf8054a1 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/YAxisRendererHorizontalBarChart.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/YAxisRendererHorizontalBarChart.java @@ -156,7 +156,7 @@ protected void drawYLabels(Canvas c, float fixedPosition, float[] positions, flo } @Override - public float[] getTransformedPositions() { + protected float[] getTransformedPositions() { if(mGetTransformedPositionsBuffer.length != mYAxis.mEntryCount * 2) { mGetTransformedPositionsBuffer = new float[mYAxis.mEntryCount * 2]; diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/utils/Utils.java b/MPChartLib/src/main/java/com/github/mikephil/charting/utils/Utils.java index 996dc9fb00..c302673919 100644 --- a/MPChartLib/src/main/java/com/github/mikephil/charting/utils/Utils.java +++ b/MPChartLib/src/main/java/com/github/mikephil/charting/utils/Utils.java @@ -1,8 +1,6 @@ package com.github.mikephil.charting.utils; -import static android.util.TypedValue.COMPLEX_UNIT_DIP; - import android.annotation.SuppressLint; import android.content.Context; import android.content.res.Resources; @@ -18,14 +16,11 @@ import android.util.DisplayMetrics; import android.util.Log; import android.util.SizeF; -import android.util.TypedValue; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.ViewConfiguration; -import androidx.annotation.NonNull; - import com.github.mikephil.charting.formatter.DefaultValueFormatter; import com.github.mikephil.charting.formatter.IValueFormatter; @@ -141,15 +136,6 @@ public static float convertPixelsToDp(float px) { return px / mMetrics.density; } - public static int dpToPx(@NonNull Context ctx, float dp) { - Resources r = ctx.getResources(); - return (int) TypedValue.applyDimension( - COMPLEX_UNIT_DIP, - dp, - r.getDisplayMetrics() - ); - } - /** * calculates the approximate width of a text, depending on a demo text * avoid repeated calls (e.g. inside drawing methods)