目前正在用MPAndroidChart画波形图,发现MPAndroidChart的高亮线并不能显示文字。项目的需求是将高亮线所在点的X、Y轴的值显示到图形的上方,如图2所示。
图1
图2
本人用的是MPAndroidChart的依赖库。所以可以直接修改源码。折线图中的高亮线显示是由
com.github.mikephil.charting.renderer目录下的LineChartRenderer文件中的drawHighlighted函数画的。所以直接修改该函数。
原函数为
@Override public void drawHighlighted(Canvas c, Highlight[] indices) { LineData lineData = mChart.getLineData(); 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; 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); } }
修改为
@Override public void drawHighlighted(Canvas c, Highlight[] indices) { LineData lineData = mChart.getLineData(); String text; float Local_x,Local_y; 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; Local_x = e.getX(); Local_y = e.getY(); MPPointD pix = mChart.getTransformer(set.getAxisDependency()).getPixelForValues(Local_x, Local_y * mAnimator .getPhaseY()); high.setDraw((float) pix.x, (float) pix.y); text =String.format(Locale.CHINA, "(X:%1$.2f Y:%2$.2f)", Local_x,Local_y); if(pix.x < mViewPortHandler.contentRight() - 100) { c.drawText(text, (float) pix.x, mViewPortHandler.contentTop() + 20f, mHighlightPaint); }else { c.drawText(text, (float) pix.x -90, mViewPortHandler.contentTop() + 20f, mHighlightPaint); } // draw the lines drawHighlightLines(c, (float) pix.x, (float) pix.y, set); } }
修改的地方用粗体字标出,希望能帮到大家,同时也防止自己遗忘。