【问题标题】:Increase the width of the selected column in bar chart of MPAndroidChart增加MPAndroidChart条形图中选中列的宽度
【发布时间】:2019-04-09 11:53:37
【问题描述】:

有没有办法增加所选列的栏宽?我想实现这样的目标。

【问题讨论】:

    标签: android mpandroidchart


    【解决方案1】:

    找到了一种方法。我扩展了 BarChartRenderer 类并覆盖了 drawHighlighted 方法。

    public class CustomBarChartRenderer extends BarChartRenderer {
    
    public CustomBarChartRenderer(BarDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler) {
        super(chart, animator, viewPortHandler);
    }
    
    @Override
    public void drawHighlighted(Canvas c, Highlight[] indices) {
        for (int i = 0; i < indices.length; i++) {
    
            Highlight h = indices[i];
            int index = h.getXIndex();
    
            BarData barData = mChart.getBarData();
    
            for (int j = 0; j < barData.getDataSetCount(); j++) {
    
                IBarDataSet set = barData.getDataSetByIndex(j);
    
                if (set.isVisible() && set.getEntryCount() > 0) {
                    customDrawDataSet(c, set, j, index);
                }
            }
        }
    }
    
    protected void customDrawDataSet(Canvas c, IBarDataSet dataSet, int index, int selectedIndex) {
        Transformer trans = mChart.getTransformer(dataSet.getAxisDependency());
    
        mShadowPaint.setColor(dataSet.getBarShadowColor());
    
        float phaseX = mAnimator.getPhaseX();
        float phaseY = mAnimator.getPhaseY();
    
        // initialize the buffer
        BarBuffer buffer = mBarBuffers[index];
        buffer.setPhases(phaseX, phaseY);
        buffer.setBarSpace(dataSet.getBarSpace());
        buffer.setDataSet(index);
        buffer.setInverted(mChart.isInverted(dataSet.getAxisDependency()));
    
        buffer.feed(dataSet);
    
        trans.pointValuesToPixel(buffer.buffer);
    
        // draw the bar shadow before the values
        if (mChart.isDrawBarShadowEnabled()) {
    
            for (int j = 0; j < buffer.size(); j += 4) {
    
                if (!mViewPortHandler.isInBoundsLeft(buffer.buffer[j + 2]))
                    continue;
    
                if (!mViewPortHandler.isInBoundsRight(buffer.buffer[j]))
                    break;
    
                c.drawRect(buffer.buffer[j], mViewPortHandler.contentTop(),
                        buffer.buffer[j + 2],
                        mViewPortHandler.contentBottom(), mShadowPaint);
            }
        }
    
        // if multiple colors
        if (dataSet.getColors().size() > 1) {
    
            for (int j = 0; j < buffer.size(); j += 4) {
    
                mHighlightPaint.setColor(Color.rgb(255, 255, 255));
                mHighlightPaint.setAlpha(dataSet.getHighLightAlpha());
    
                if (!mViewPortHandler.isInBoundsLeft(buffer.buffer[j + 2]))
                    continue;
    
                if (!mViewPortHandler.isInBoundsRight(buffer.buffer[j]))
                    break;
    
                // Set the color for the currently drawn value. If the index
                // is
                // out of bounds, reuse colors.
                float left = 0f;
                float top = 0f;
                float right = 0f;
                float bottom = 0f;
    
                if( j == (selectedIndex * 4)) {
                    left = buffer.buffer[j] - 10;
                    top = buffer.buffer[j + 1];
                    right = buffer.buffer[j + 2] + 10;
                    bottom = buffer.buffer[j + 3];
    
                    mRenderPaint.setColor(dataSet.getColor(j / 4));
                }
                else {
                    left = buffer.buffer[j];
                    top = buffer.buffer[j + 1];
                    right = buffer.buffer[j + 2];
                    bottom = buffer.buffer[j + 3];
    
                    mRenderPaint = mHighlightPaint;
                }
    
                c.drawRect(left, top, right, bottom, mRenderPaint);
            }
        } else {
    
            mRenderPaint.setColor(dataSet.getColor());
    
            for (int j = 0; j < buffer.size(); j += 4) {
    
                mHighlightPaint.setColor(Color.rgb(255, 255, 255));
                mHighlightPaint.setAlpha(dataSet.getHighLightAlpha());
    
                if (!mViewPortHandler.isInBoundsLeft(buffer.buffer[j + 2]))
                    continue;
    
                if (!mViewPortHandler.isInBoundsRight(buffer.buffer[j]))
                    break;
    
                float left = 0f;
                float top = 0f;
                float right = 0f;
                float bottom = 0f;
    
                if( j == (selectedIndex * 4)) {
                    left = buffer.buffer[j] - 10;
                    top = buffer.buffer[j + 1];
                    right = buffer.buffer[j + 2] + 10;
                    bottom = buffer.buffer[j + 3];
    
                    mRenderPaint.setColor(dataSet.getColor(j / 4));
                }
                else {
                    left = buffer.buffer[j];
                    top = buffer.buffer[j + 1];
                    right = buffer.buffer[j + 2];
                    bottom = buffer.buffer[j + 3];
    
                    mRenderPaint = mHighlightPaint;
                }
    
                c.drawRect(left, top, right, bottom, mRenderPaint);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-02-10
      • 1970-01-01
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      相关资源
      最近更新 更多