MPAndroidChart: Can I set different colours for the x-axis labels?

后端 未结 1 1704
情歌与酒
情歌与酒 2020-12-20 22:16

So I want to be able to select a bar in my bar chart, and when I select a bar, it changes the colour of the bar (which I know how to do), but also change the colour of the c

1条回答
  •  隐瞒了意图╮
    2020-12-20 22:54

    Yes it is possible to set different colors for the xAxis labels. You will have to use a custom renderer, something like below:

    import android.graphics.Canvas;
    
    import com.github.mikephil.charting.components.XAxis;
    import com.github.mikephil.charting.renderer.XAxisRenderer;
    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;
    
    import java.util.Collections;
    import java.util.List;
    
    /**
     * Created by rawsond on 29/01/17.
     */
    
    public class ColoredLabelXAxisRenderer extends XAxisRenderer {
    
        List labelColors;
    
        public ColoredLabelXAxisRenderer(ViewPortHandler viewPortHandler, XAxis xAxis, Transformer trans) {
            super(viewPortHandler, xAxis, trans);
            labelColors = Collections.EMPTY_LIST;
        }
    
        public ColoredLabelXAxisRenderer(ViewPortHandler viewPortHandler, XAxis xAxis, Transformer trans, List colors) {
            super(viewPortHandler, xAxis, trans);
            this.labelColors = colors;
        }
    
        @Override
        protected void drawLabels(Canvas c, float pos, MPPointF anchor) {
            final float labelRotationAngleDegrees = mXAxis.getLabelRotationAngle();
            boolean centeringEnabled = mXAxis.isCenterAxisLabelsEnabled();
    
            float[] positions = new float[mXAxis.mEntryCount * 2];
    
            for (int i = 0; i < positions.length; i += 2) {
    
                // only fill x values
                if (centeringEnabled) {
                    positions[i] = mXAxis.mCenteredEntries[i / 2];
                } else {
                    positions[i] = mXAxis.mEntries[i / 2];
                }
            }
    
            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);
                    int color = getColorForXValue(mXAxis.mEntries[i / 2]); //added
    
                    mAxisLabelPaint.setColor(color);
    
                    if (mXAxis.isAvoidFirstLastClippingEnabled()) {
    
                        // avoid clipping of the last
                        if (i == mXAxis.mEntryCount - 1 && mXAxis.mEntryCount > 1) {
                            float width = Utils.calcTextWidth(mAxisLabelPaint, label);
    
                            if (width > mViewPortHandler.offsetRight() * 2
                                    && x + width > mViewPortHandler.getChartWidth())
                                x -= width / 2;
    
                            // avoid clipping of the first
                        } else if (i == 0) {
    
                            float width = Utils.calcTextWidth(mAxisLabelPaint, label);
                            x += width / 2;
                        }
                    }
    
                    drawLabel(c, label, x, pos, anchor, labelRotationAngleDegrees);
                }
            }
        }
    
        private int getColorForXValue(int index) {
            if (index >= labelColors.size()) return mXAxis.getTextColor();
    
            if (index < 0) return mXAxis.getTextColor();
    
            return labelColors.get(index);
        }
    }
    

    Consume it like this:

    mChart.setXAxisRenderer(new ColoredLabelXAxisRenderer(mChart.getViewPortHandler(), mChart.getXAxis(), mChart.getTransformer(AxisDependency.LEFT), colors));
    

    where colors is a List of resolved colors (not resource ids) the same size as the number of entries in the IDataSet. Since you already know how to change the color of the bar on a highlight, that part is up to you. Just manipulate colors in the same way you would normally. Here is a sample output:

    0 讨论(0)
提交回复
热议问题