2017-01-17 3 views
1

Я использую MPAndroidChart для отображения линейной диаграммы для моего приложения. У меня уже есть прослушиватель с двойным нажатием для всего диаграммы.MPAndroidChart LineChart Double Tap Gesture Control

Есть ли способ получить управление прослушиванием двойного крана для отдельной точки в линейной диаграмме? Мое лучшее предположение заключается в том, чтобы непосредственно получить объект View точки и реализовать прослушиватель жестов для этого же. Если это правдоподобно, как я могу это достичь?

Если это невозможно с помощью MPAndroidChart, есть ли другая библиотека, которая может мне помочь?

ответ

2

Ваше решение предполагает создание класса, который реализует OnChartGestureListener

Вы можете сразу увидеть, есть метод:

void onChartDoubleTapped(android.view.MotionEvent me); 

Вы бы для реализации этого метода с требуемой функциональностью. Вероятно, это связано с получением исходных точек касания пикселя от MotionEvent и преобразования их в значения x и y на диаграмме. Существует инструкции о том, как сделать это в this answer и в коде ниже:

@Override 
public void onChartDoubleTapped(MotionEvent me) { 
    float tappedX = me.getX(); 
    float tappedY = me.getY(); 
    MPPointD point = mChart.getTransformer(YAxis.AxisDependency.LEFT).getValuesByTouchPoint(tappedX, tappedY); 
    Log.d(TAG, "tapped at: " + point.x + "," + point.y); 
} 

Дальнейшие примеры пользовательских OnChartGestureListener находятся внутри example project here

+0

приятное и полезное решение, спасибо :) – firegloves

1

Deeping в LineChartRenderer Я думаю, что это невозможно, потому что график рендеринг достигается рисования непосредственно на Canvas нравится следующим образом:

canvas.drawPath(mCirclePathBuffer, mRenderPaint); 

Вы могли бы попытаться напечатать все графах детей, чтобы проверить, если я ошибаюсь, что-то вроде :

int size =lineChart.getChildCount(); 
for (int i=0; i<size; i++) { 
    View v = lineChart.getChildAt(i); 
    Log.i("### LINE", "### INSTANCE OF " + v.getClass()); 
} 

Если есть виды детей, они должны быть доступны ему таким образом.

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

Другие варианты могут быть реализованы в OnChartValueSelectedListener и эмулировать двойной кран с механизмом таймера.

Я не думаю, что есть библиотека, которая поддерживает эту функциональность.

Позвольте мне знать, если вы найдете решение, пожалуйста,

+0

Или лучше вы можете использовать Android Studio -> Инструменты -> Android -> Макет Inspector – firegloves

+0

Спасибо за решение, я вернусь к вам, как только попробую. – androidnoob

2

Дэвид Роусон-х answer просто идеально подходит и отвечает на вопрос, не оставляющую камня неперевернутый. Однако, по моей ситуации, я нашел answer огнезащитными средствами более полезными. Я действительно получаю объект Entry с использованием решения firegloves для получения значений. Ниже приведен код для решения моей проблемы, но, пожалуйста, обратите внимание, что это решение является взломанным и не рекомендуется до абсолютно необходимого. Если вы хотите получить чистое решение, ответ Дэвида Роусона уже охватывает этот номер.

mChart.setOnChartValueSelectedListener(new OnChartValueSelectedListener() { 
     @Override 
     public void onValueSelected(Entry e, Highlight h) { 
      final long selectionTime = System.currentTimeMillis(); 
      final Highlight copyHighlight = h; 
      final Entry copyEntry = e; 
      final boolean[] isTapped = {false}; 
      mChart.setOnTouchListener(new View.OnTouchListener() { 
       @Override 
       public boolean onTouch(View view, MotionEvent motionEvent) { 
        if (!isTapped[0]) { 
         final long doubleTapTime = System.currentTimeMillis(); 
         if (doubleTapTime - selectionTime < 300) { 
          if ((motionEvent.getX() <= copyHighlight.getDrawX() + 50 
            && motionEvent.getX() >= copyHighlight.getDrawX() - 50) 
            && (motionEvent.getY() <= copyHighlight.getDrawY() + 50 
            && motionEvent.getY() >= motionEvent.getY() - 50)) { 
           if (copyEntry.getX() == 1.0f && copyEntry.getY() == 1.0f) { 
            Toast.makeText(MainActivity.this, "1,1", Toast.LENGTH_SHORT).show(); 
           } else if (copyEntry.getX() == 2.0f && copyEntry.getY() == 2.0f) { 
            Toast.makeText(MainActivity.this, "2,2", Toast.LENGTH_SHORT).show(); 
           } else if (copyEntry.getX() == 3.0f && copyEntry.getY() == 3.0f) { 
            Toast.makeText(MainActivity.this, "3,3", Toast.LENGTH_SHORT).show(); 
           } 
          } 
         } 
        } 
        isTapped[0] = true; 
        return false; 
       } 
      }); 
     } 

     @Override 
     public void onNothingSelected() { 

     } 
    }); 

фрагмент кода выше, дайте мне работать с Entry объектом, который был связан с точкой, которая была дважды повернутой.Кроме того, я установил диапазон в 100 пикселей, в то время как точка была двойным нажатием для удобства нажатия пальца.

Хотелось бы узнать, есть ли чистое решение для двойного нажатия на значение при получении его данных Entry.