Пользовательские индикаторы меток на оси X в MPAndroidChart

#android #mpandroidchart

#Android #диаграмма mpandroidchart

Вопрос:

Я использую библиотеку диаграмм под названием MPAndroidChart, и она отвечает большинству моих потребностей. Однако мне нужно настроить некоторые части.

  1. Я хочу нарисовать несколько индикаторных линий для меток на xAxis вот так :

введите описание изображения здесь

По мере того, как я копался, я мог бы написать CustomAxisRenderer но, похоже, мне нужно скопировать большую часть super кодов классов.

  1. Я хочу, чтобы минимальное значение было нарисовано точно на xAxis . Это минимальное значение также может быть равно 0 или любому другому числу.

введите описание изображения здесь

Как это можно сделать? Возможно ли это вообще?

Будем признательны за любую помощь или подсказку.

Ответ №1:

Я решил первую проблему:

 internal class IndicatorAxisRenderer(
    viewPortHandler: ViewPortHandler,
    xAxis: XAxis,
    trans: Transformer
) : XAxisRenderer(viewPortHandler, xAxis, trans) {

    private var indicatorWidth = 1f
    private var indicatorHeight = 1f

    private fun getXLabelPositions(): FloatArray {
        var i = 0
        val positions = FloatArray(mXAxis.mEntryCount * 2)
        val centeringEnabled = mXAxis.isCenterAxisLabelsEnabled
        while (i < positions.size) {
            if (centeringEnabled) {
                positions[i] = mXAxis.mCenteredEntries[i / 2]
            } else {
                positions[i] = mXAxis.mEntries[i / 2]
            }
            positions[i   1] = 0f
            i  = 2
        }
        mTrans.pointValuesToPixel(positions)
        return positions
    }

    override fun renderAxisLine(c: Canvas?) {
        super.renderAxisLine(c)
        val positions = getXLabelPositions()
        var i = 0
        while (i < positions.size) {
            val x = positions[i]
            if (mViewPortHandler.isInBoundsX(x)) {
                val y = mViewPortHandler.contentBottom()
                c?.drawLine(
                    x, y,
                    x, y   indicatorHeight,
                    mAxisLinePaint
                )
            }
            i  = 2
        }
    }

    fun setIndicatorSize(width: Float, height: Float) {
        this.indicatorWidth = width
        this.indicatorHeight = height
    }
}
  

Этот код отображает линии индикатора поверх оси X.

Комментарии:

1. Есть ли у вас пример использования этого класса?

2. @Dante313 Да, это сработало с моей проблемой и все еще работает над моим предыдущим проектом

3. Это круто. На самом деле я тоже уже это реализовал. Это спасло меня. У вас есть примеры кода, как вы на самом деле создаете экземпляр этого класса? 🙂 Кстати, я думаю, что в этом классе у нас нет места, где мы используем indicatorWidth переменную :/

4. @Dante313 к сожалению, у меня нет доступного примера:(