其他分享
首页 > 其他分享> > 如何将背景添加到MPAndroidCharts xAxis标签?

如何将背景添加到MPAndroidCharts xAxis标签?

作者:互联网

我想将背景色添加到图表线的x轴标签中,并将y轴放置在网格线上方,如屏幕截图所示.是否可以在不定制库的情况下实现这一目标?

解决方法:

我不想弄乱Library,所以我不得不扩展几个类并重写一些方法来满足我的要求.我所做的如下:

扩展XAxis类并重写:

private int mXAxisLabelBackgroundColor = Color.argb(200, 140, 234, 255);
/**
 * boolen used to enable or disable label background, default is enabled
 */
private boolean mEnableLabelBackground = false;


public CustomXAxis(){
    super();
}

public void setLabelBackgroundColor(int color){
    mXAxisLabelBackgroundColor = color;
}

public void setLabelBackgroundColor(String colorHex){
    mXAxisLabelBackgroundColor = Color.parseColor(colorHex);
}

public int getXAxisLabelBackgroundColor(){
    return mXAxisLabelBackgroundColor;
}

/**
 * Enable/disable X Axis label background, default is disabled.
 * @param enable
 */
public void setDrawLabelBackground(boolean enable){
    mEnableLabelBackground = enable;
}

/**
 *
 * @return boolean true if drawing label background is enabled otherwise false
 */
public boolean isDrawLabelBackgroundEnabled(){
    return mEnableLabelBackground;
}

扩展XAxisRenderer并覆盖drawLabels(Canvas c,float pos).在绘制标签之前绘制一个矩形.

        if (((CustomXAxis)mXAxis).isDrawLabelBackgroundEnabled()) {
           drawLabelBackground(c);
        }

扩展YAxis,仅添加访问器和增幅器即可将Yaxis标签设置在网格线的上方或下方.

private float mYLabelPosition = 0f;

public CustomYAxisRight(){
    super(AxisDependency.RIGHT);
}

/**
 * Sets the label position above or below the gridline.
 * <p>use negative number to set label position above gridline.</p>
 * @param position
 */
public void setYLabelPosition(float position){
    mYLabelPosition = position;
}

public float getYLabelPosition(){
    return mYLabelPosition;
}

扩展YAxisRenderer并覆盖drawYLabels(画布c,float fixedPosition,float []位置,float偏移量)

c.drawText(text, fixedPosition, positions[i * 2 + 1] + (offset+((CustomYAxisRight)mYAxis).getYLabelPosition()), mAxisLabelPaint);

当图表从0开始时,我还想显示Y轴标签0的网格线.

覆盖renderGridlines(Canvas c)并在绘制其他线条之前绘制一条线条.

if (mYAxis.isStartAtZeroEnabled()) {
        mTrans.pointValuesToPixel(position);
        gridLinePath.moveTo(mViewPortHandler.offsetLeft(), mViewPortHandler.contentBottom() - 1f);
        gridLinePath.lineTo(mViewPortHandler.contentRight(), mViewPortHandler.contentBottom() - 1f);
        // draw a path because lines don't support dashing on lower android versions
        c.drawPath(gridLinePath, mGridPaint);
        gridLinePath.reset();
    }

最后扩展LineChart并覆盖:

    @Override
protected void init() {
    super.init();
    mAxisRight = new CustomYAxisRight();
    mXAxis = new CustomXAxis();
    mAxisRendererRight = new CustomYAxisRenderer(mViewPortHandler,mAxisRight,mRightAxisTransformer);
    mXAxisRenderer = new CustomXAxisRenderer(mViewPortHandler, mXAxis, mLeftAxisTransformer);
}

@Override
public void setViewPortOffsets(final float left, final float top, final float right, final float bottom) {
    mCustomViewPortEnabled = true;
    if (((CustomXAxis)mXAxis).isDrawLabelBackgroundEnabled()){
        if (bottom == 0){
            //we have to leave a space for the labels to draw
            _bottomOffset = 80f;
        }
    }
    post(new Runnable() {

        @Override
        public void run() {

            mViewPortHandler.restrainViewPort(left, top, right, _bottomOffset);
            prepareOffsetMatrix();
            prepareValuePxMatrix();
        }
    });
}

标签:mpandroidchart,android
来源: https://codeday.me/bug/20191120/2040806.html