Только ответ 3.:
chart.visibleXRange
дает вам разницу между самым низким и самым высоким видимым значением x. Точно так же chart.visibleYRange
дает значения для оси Y.
Имейте в виду, что (если вы определили dragOffsetX) при прокрутке до конца к левой или правой границе диаграммы, тогда самая низкая или соответственно, самое высокое значение - это самое низкое / самое высокое значение, фактически встречающееся в ваших данных, но не значение x, соответствующее левой / правой границе диаграммы. Чтобы получить это значение, вы можете использовать chart.getValuesByTouchPoint(...)
и chart.contentRect
.
Я использую следующую функцию, чтобы определить точный интервал между метками, который помогает мне решить, с какой степенью детализации я хочу отформатировать метки (в моем case секунды против миллисекунд). Основная часть, которая преобразует rawInterval
в interval
, берется из com.github.mikephil.charting.renderer.AxisRenderer.computeAxisValue
и переводится в Kotlin:
fun calculateIntervalBetweenLabels(): Double {
val range = chart.getValuesByTouchPoint(chart.contentRect.right, 0f, YAxis.AxisDependency.LEFT).x - chart.getValuesByTouchPoint(chart.contentRect.left, 0f, YAxis.AxisDependency.LEFT).x
val rawInterval = range / chart.xAxis.labelCount
var interval = Utils.roundToNextSignificant(rawInterval).toDouble()
val intervalMagnitude = Utils.roundToNextSignificant(10.0.pow(log10(interval).toInt())).toDouble()
val intervalSigDigit = (interval / intervalMagnitude).toInt()
if (intervalSigDigit > 5) {
interval = floor(10 * intervalMagnitude)
}
return interval
}
В более простых случаях без dragOffsetX первую строку можно заменить на val range = chart.visibleXRange
.
В моем ValueFormatter я делаю это:
override fun getFormattedValue(value: Float): String {
return when {
calculateIntervalBetweenLabels().roundToLong() >= 1000 -> formatValueInSeconds(value)
else -> formatValueInMilliseconds(value)
}
}