首页 文章

如何在MPAndroidCharts xAxis标签中添加背景?

提问于
浏览
3

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

enter image description here

1 回答

  • 3

    我不想弄乱图书馆所以我不得不扩展几个类并覆盖几个方法来满足我的要求 . 我做的是如下:

    扩展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(Canvas c,float fixedPosition,float [] position,float offset)

    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();
            }
        });
    }
    

    End result

相关问题