2017-01-17 14 views
1

私のアプリケーションの折れ線グラフを表示するのにMPAndroidChartを使用しています。私が既に持っているのは、全体のグラフのダブルタップのリスナーです。MPAndroidChart LineChartダブルタップジェスチャーコントロール

折れ線グラフの個々のポイントに対してダブルタップリスナーコントロールを取得する方法はありますか?私の最高の推測は、ポイントのViewオブジェクトを直接取得し、同じもののジェスチャリスナーを実装することです。それがもっともらしいのであれば、どうしたらいいですか?

これはMPAndroidChartを使用することができない場合は、私にこれを助ける他のライブラリがありますか?グラフのレンダリングはキャンバスに直接描画に達しているので、私はそれは不可能だと思うLineChartRendererにディーピング

答えて

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

などは、次のとおりです。

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()); 
} 

子供の視聴がある場合は、この方法でアクセスできる必要があります。

そうしないと、タップ位置がマップされた位置に対応する場合、あなたがチェックしようとすることができ、あなたの全体のLineGraphにダブルタップを傍受しようとすることができますが、私は自分で全体の仕事をしなければならないと思います。

OnChartValueSelectedListenerを実装し、タイマーメカニズムを使用してダブルタップをエミュレートすることもできます。

この機能をサポートするライブラリはありません。

は、あなたが解決策を見つけるなら、私に知らせてください

+0

また、Androidスタジオ - >ツール - > Android - >レイアウトインスペクタ – firegloves

+0

をお使いいただければ幸いです。解決していただきありがとうございます。 – androidnoob

2

内デビッドローソンのanswerが完璧で、何の石を残さない質問に答えるされていますトゥーン。しかし、私の状況では、fireglovesを使ってanswerがより有用であることがわかりました。実際に値を取得するためにFireglovesのソリューションを使ってEntryオブジェクトを取得します。以下は私の問題を解決しましたが、このソリューションがハックされ、絶対に必要になるまではお勧めできませんことに注意してください何のためのコードです。クリーンな解決策が必要な場合は、David Rawsonの答えはすでにです。

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データを取得しながら値をダブルタップするクリーンなソリューションがあるかどうかを知りたいと思います。