如何在MPAndroidChart的LineChart中添加垂直短划线及虚线
LineChart短竖线刻度指示实现方案
你之前使用的chart.xAxis.setDrawGridLinesBehindData(false)仅能控制网格线和数据的层叠顺序,无法修改网格线的绘制长度,要实现仅在X轴刻度位置绘制指定高度的短竖线效果,可通过以下两种方案实现:
方案一:自定义X轴渲染器(推荐,性能最优)
该方案通过重写X轴的绘制逻辑实现自定义短竖线,适配任意数据量场景:
- 首先关闭原生X轴网格线绘制,避免和自定义逻辑冲突:
chart.xAxis.setDrawGridLines(false)
- 自定义
XAxisRenderer子类,重写网格线绘制逻辑:
class CustomXAxisRenderer( chart: LineChart, // 自定义短竖线高度,单位为dp private val indicatorLineHeight: Float = 15f ) : XAxisRenderer( chart.viewPortHandler, chart.xAxis, chart.getTransformer(YAxis.AxisDependency.LEFT) ) { private val gridPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { color = Color.LTGRAY strokeWidth = 2f style = Paint.Style.STROKE } override fun drawGridLines(c: Canvas) { if (!mXAxis.isEnabled) return val transform = mTrans val pointBuffer = FloatArray(2) val lineHeightPx = Utils.convertDpToPixel(indicatorLineHeight) // 遍历所有X轴刻度点位 for (i in 0 until mXAxis.mEntryCount) { pointBuffer[0] = mXAxis.mEntries[i] pointBuffer[1] = 0f transform.pointValuesToPixel(pointBuffer) // 仅绘制可视范围内的刻度线 if (pointBuffer[0] in mViewPortHandler.contentLeft()..mViewPortHandler.contentRight()) { c.drawLine( pointBuffer[0], mViewPortHandler.contentBottom(), pointBuffer[0], mViewPortHandler.contentBottom() - lineHeightPx, gridPaint ) } } } }
- 给LineChart绑定自定义渲染器即可:
chart.setXAxisRenderer(CustomXAxisRenderer(chart, 15f)) // 你之前配置的ValueFormatter、坐标轴样式等无需修改
方案二:LimitLine实现(适合少量数据场景)
如果数据量小于10条,可以通过添加X轴限制线快速实现效果,代码改动更小:
// xValues为你的X轴刻度值数组 xValues.forEach { x -> val indicatorLine = LimitLine(x).apply { lineColor = Color.LTGRAY lineWidth = 2f label = "" // 隐藏LimitLine默认标签 } chart.xAxis.addLimitLine(indicatorLine) } chart.xAxis.setDrawLimitLinesBehindData(true)
内容的提问来源于stack exchange,提问作者Artem Winokurov
相关产品推荐
相关产品推荐

