MPAndroidChart icon indicating copy to clipboard operation
MPAndroidChart copied to clipboard

How can I implement this function

Open OhPeterPan opened this issue 1 year ago • 10 comments

飞书20220726-165458

OhPeterPan avatar Jul 26 '22 08:07 OhPeterPan

这个库不太好绘制多个交点,绘制一个挺简单的。前者可能需要大改...

gs666 avatar Aug 04 '22 05:08 gs666

image 我这只做到了点击绿线画绿点,蓝线画蓝点,因为它是依赖单根线的,绘制一个点的时候并不知道另一个交点的坐标。如果有人知道解决方案,希望能指教下~

gs666 avatar Aug 04 '22 05:08 gs666

image 我这只做到了点击绿线画绿点,蓝线画蓝点,因为它是依赖单根线的,绘制一个点的时候并不知道另一个交点的坐标。如果有人知道解决方案,希望能指教下~

这个库不太好绘制多个交点,绘制一个挺简单的。前者可能需要大改...

我把源码弄下来,改改里面的东西实现了,不过你的这种markview我没有实现阴影,最后跟ui商量弄了个灰色的框完事儿

OhPeterPan avatar Aug 04 '22 06:08 OhPeterPan

可以贴一下多交点绘制的核心代码吗?感谢。

gs666 avatar Aug 04 '22 10:08 gs666

阴影方案我用的ShadowLayout。https://github.com/lihangleo2/ShadowLayout 就一个类文件,导入很方便,用起来也很不错。

gs666 avatar Aug 04 '22 10:08 gs666

可以贴一下多交点绘制的核心代码吗?感谢。

@Override
public void drawHighlighted(Canvas c, Highlight[] indices) {

    LineData lineData = mChart.getLineData();
    int entryIndex = -1;
    for (Highlight high : indices) {

        ILineDataSet set = lineData.getDataSetByIndex(high.getDataSetIndex());

        if (set == null || !set.isHighlightEnabled())
            continue;

        Entry e = set.getEntryForXValue(high.getX(), high.getY());

        if (!isInBoundsX(e, set))
            continue;
        entryIndex = set.getEntryIndex(e);
        MPPointD pix = mChart.getTransformer(set.getAxisDependency()).getPixelForValues(e.getX(), e.getY() * mAnimator
                .getPhaseY());

        high.setDraw((float) pix.x, (float) pix.y);

        // draw the lines
        drawHighlightLines(c, (float) pix.x, (float) pix.y, set);
    }
    if (entryIndex < 0) {
        return;
    }
    if (mChart instanceof BarLineChartBase) {
        BarLineChartBase chart = (BarLineChartBase) this.mChart;
        if (chart.isHighlightSerial()) {
            mHighlightPaint.reset();
            mHighlightNodeBgPaint.reset();
            mHighlightPaint.setAntiAlias(true);
            mHighlightNodeBgPaint.setAntiAlias(true);
            mHighlightPaint.setStrokeWidth(chart.getHighCircleWidth());
            mHighlightPaint.setStyle(Paint.Style.STROKE);
            mHighlightNodeBgPaint.setStyle(Paint.Style.FILL);
            mHighlightNodeBgPaint.setColor(Color.WHITE);
            List<ILineDataSet> dataSets = lineData.getDataSets();
            for (ILineDataSet set :
                    dataSets) {
                Entry e = set.getEntryForIndex(entryIndex);
                MPPointD pix = mChart.getTransformer(set.getAxisDependency()).getPixelForValues(e.getX(), e.getY() * mAnimator
                        .getPhaseY());

                drawHalo(c, (float) pix.x, (float) pix.y,chart, set);
            }
        }
    }

}

private final Paint mHighlightPaint = new Paint();
private final Paint mHighlightNodeBgPaint = new Paint();

private void drawHalo(Canvas c, float x, float y, BarLineChartBase chart, ILineDataSet set) {
    mHighlightPaint.setColor(set.getColor());
    c.drawCircle(x, y, chart.getHighlightNodeRadius(), mHighlightNodeBgPaint);
    c.drawCircle(x, y, chart.getHighlightNodeRadius(), mHighlightPaint);
}

OhPeterPan avatar Aug 04 '22 10:08 OhPeterPan

可以贴一下多交点绘制的核心代码吗?感谢。

LineChartRenderer这个类里面

OhPeterPan avatar Aug 04 '22 10:08 OhPeterPan

多谢!我研究下

gs666 avatar Aug 05 '22 02:08 gs666

代码很强,已经实现了这个功能。然后我这边的两条线对应的是每月的日子,每条线的数值个数可能不一样,加了个判断避免数组越位。

                for (ILineDataSet set : dataSets) {
                    if (entryIndex < set.getEntryCount()) {
                        Entry e = set.getEntryForIndex(entryIndex);
                        MPPointD pix = mChart.getTransformer(set.getAxisDependency())
                                .getPixelForValues(e.getX(), e.getY() * mAnimator.getPhaseY());

                        drawHighlightPoint(c, (float) pix.x, (float) pix.y, chart, set);
                    }
                }

gs666 avatar Aug 05 '22 07:08 gs666

代码很强,已经实现了这个功能。然后我这边的两条线对应的是每月的日子,每条线的数值个数可能不一样,加了个判断避免数组越位。

                for (ILineDataSet set : dataSets) {
                    if (entryIndex < set.getEntryCount()) {
                        Entry e = set.getEntryForIndex(entryIndex);
                        MPPointD pix = mChart.getTransformer(set.getAxisDependency())
                                .getPixelForValues(e.getX(), e.getY() * mAnimator.getPhaseY());

                        drawHighlightPoint(c, (float) pix.x, (float) pix.y, chart, set);
                    }
                }

能解决就好,反正源码弄下来了,想怎么搞就怎么搞

OhPeterPan avatar Aug 08 '22 01:08 OhPeterPan