MPChart Android setCircleColor не отражает - PullRequest
0 голосов
/ 24 января 2019

Я использую библиотеку MPChartAndroid.

Я использую

setCircleColor ()

для изменения цвета круга в lineDataSet Как ни страннометоды setCircleColor() и setCircleHoleColor() не работают.

, запрашивающий линейную диаграмму с помощью mDataSet.getCircleHoleColor() и mDataSet.getCircleColor(), возвращает новые цвета, но диаграмма отображает старый цвет даже после mChart.invalidate ()

Я также пытался

  mDataSet.resetCircleColors();
  mDataSet.setCircleColor(color);

  mDataSet.setDrawCircles(true);

, но похоже, что он не работает.

Хотя методы

mDataSet.setColor()
mDataSet.setFillColor() 

работают нормально.

Есть ли проблема с аппаратным ускорением или я что-то здесь упускаю?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Очевидно, класс LineChartRenderer хранит кэш растровых изображений для круговых растровых изображений для каждого набора данных.

Новые растровые изображения создаются, если этот метод в LineChartRenderer возвращает значение true.

   /**
         * Sets up the cache, returns true if a change of cache was required.
         *
         * @param set
         * @return
         */
        protected boolean init(ILineDataSet set) {

            int size = set.getCircleColorCount();
            boolean changeRequired = false;

            if (circleBitmaps == null) {
                circleBitmaps = new Bitmap[size];
                changeRequired = true;
            } else if (circleBitmaps.length != size) {
                circleBitmaps = new Bitmap[size];
                changeRequired = true;
            }

            return changeRequired;
        }

Следовательно, даже если новый цвет установлен с помощью setCircleColor() или setCircleHoleColor(), новые растровые изображения не создаются, поэтому на диаграмме отображаются старые цветные круги.

Эту проблему можно решить либо с помощью

  1. Очистка массива кэша растрового изображения.(Невозможно импортировать библиотеку как модуль, так как circleBitmaps является личным)

2.Используя пользовательский LineChartRenderer

3. Путем обмана init()способ вернуть истину.Таким образом, чтобы динамически изменить цвет круга, используйте

 mDataSet.setDrawCircles(true);
int colorCount= mDataSet.getCircleColors().size();
mDataSet.resetCircleColors();
mDataSet.setCircleColor(color);
if(colorCount==1){mDataSet.getCircleColors().add(color);}

вместо

 mDataSet.setCircleColor(color);

и чтобы изменить цвет отверстия круга динамически , используйте

mDataSet.setCircleColorHole(color);
int circleColor= mDataSet.getCircleColors().get(0);
int colorCount = mDataSet.getCircleColors().size();
mDataSet.resetCircleColors();
mDataSet.setCircleColor(circleColor);
if(colorCount==1){mDataSet.getCircleColors().add(circleColor);}

вместо

 mDataSet.setCircleColorHole(color);

ПРИМЕЧАНИЕ. Это работает, только если вы планируете использовать один цвет круга!Протестировано на MpChartAndroid v3.0.2

Спасибо @cristallo за помощь.

0 голосов
/ 24 января 2019

Я использую setCircleColor и getCircleHoleColor. Они работают нормально, но я определяю его перед добавлением LineDataSet к LineData, затем я назначаю LineData для LineChart и вызываю метод invalidate на LineChart

lineChart - это com.github.mikephil.charting.charts.LineChart

LineData lineData = new LineData();
LineDataSet lineDataSet = new LineDataSet(lineDataEntries, null);
lineDataSet.setDrawCircles(true);
lineDataSet.setDrawCircleHole(false);
lineDataSet.setCircleColor(Color.RED);
lineDataSet.setMode(LineDataSet.Mode.LINEAR);
lineData.addDataSet(lineDataSet);
lineChart.setData(lineData);
lineChart.invalidate();

ПРИМЕЧАНИЕ. MpChart setCircleColor не принимает R.color.id в качестве параметра. Вы должны использовать тип Color или создать новый из идентификатора цвета ресурса, прежде чем использовать его. Это можно сделать с помощью метода ResourcesCompat.getColor.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...