2013-02-14 13 views
5

グラフ領域に触れる位置に垂直カーソルを表示したいと思います。この行に関連付けられたテキストビューは、バーの値にその点のy軸値を表示します。そして、指を左に動かすと(左移動または右移動)、この垂直カーソルはそれに応じて移動し、テキストビューも同様に従いますが、y軸値は新しい場所は移動すると同時に移動します。aChartEngineで線を描く

私はGraphicalViewにコールリストを取得するために登録することができるtouchlistenerがあることを知っていますが、その時点以降の使用方法はわかりません。私はtoucheventをある種のジェスチャーリスナーにも関連付けることができます。しかし、どのように私はオーバーレイが現在のチャートの上に行く垂直カーソルラインを描画するのですか?

私が持っているその他の問題は、真であるときに私はmChart.getCurrentSeriesAndPoint()の値を得ることができません。 、常にNullを返しますが、私がFalseに戻り値を変更すると値を取得できますが、私はontuchに再度アクセスすることはできません。

これは私がまさにこれをたい私のコード

mChart.setOnTouchListener(new View.OnTouchListener() { 
       @Override 
       public boolean onTouch(View v, MotionEvent event) { 
        if (event.getAction() == MotionEvent.ACTION_CANCEL) { 

         dataset.removeSeries(dataset.getSeriesCount()-1); 
         multiRenderer.removeSeriesRenderer(GraficaCuatro); 
        } 
        if (event.getAction() == MotionEvent.ACTION_DOWN) { 
         multiRenderer.setPanEnabled(false); 
         multiRenderer.setZoomEnabled(false); 
         SeriesSelection seriesSelection = mChart.getCurrentSeriesAndPoint(); 


          if(seriesSelection != null) 
          { 
           Toast.makeText(
             getActivity().getBaseContext(),"Hola", 
             Toast.LENGTH_SHORT).show(); 
          } 
         XYSeries Line = new XYSeries(""); 
         Line.add(event.getX()/1.5,minValue); 
         Line.add(event.getX()/1.5,maxValue); 
         dataset.addSeries(Line);  
         multiRenderer.addSeriesRenderer(GraficaCuatro); 
        } 
        if (event.getAction() == MotionEvent.ACTION_MOVE) { 

          dataset.removeSeries(dataset.getSeriesCount()-1); 
          multiRenderer.removeSeriesRenderer(GraficaCuatro); 
          XYSeries Line = new XYSeries(""); 
          Line.add(event.getX()/1.5,minValue); 
          Line.add(event.getX()/1.5,maxValue); 
          dataset.addSeries(Line); 
          multiRenderer.addSeriesRenderer(GraficaCuatro); 

        } 
         if (event.getAction() == MotionEvent.ACTION_UP) { 

          dataset.removeSeries(dataset.getSeriesCount()-1); 
          multiRenderer.removeSeriesRenderer(GraficaCuatro); 
         } 
        mChart.repaint(); 
        return true; 
       } 
      }); 

です。

dwef http://s2.subirimagenes.com/imagen/previo/thump_82994131.png 私は助けが必要です!

EDIT:これは私がTrueを返すときのonTouchコードです。 onTouchでは、toRealPoint()からの値。とSeriesSelectionが間違っている場合、私は本当の値を得ることができるfalseにtrueを変更します。ヘルプをお願いします

  mChart.setOnTouchListener(new View.OnTouchListener() { 
       @Override 
       public boolean onTouch(View v, MotionEvent event) { 
        SeriesSelection seriesSelection = mChart.getCurrentSeriesAndPoint(); 
        double[]values = mChart.toRealPoint(0); 
        if(seriesSelection != null) 
        { 
         if (event.getAction() == MotionEvent.ACTION_CANCEL) { 
          dataset.removeSeries(dataset.getSeriesCount()-1); 
          multiRenderer.removeSeriesRenderer(GraficaCuatro); 
         } 
         if (event.getAction() == MotionEvent.ACTION_DOWN) { 

          XYSeries Line = new XYSeries(""); 
          Line.add(seriesSelection.getXValue(),minValue); 
          Line.add(seriesSelection.getXValue(),maxValue); 
          dataset.addSeries(Line); 
          multiRenderer.addSeriesRenderer(GraficaCuatro); 
         } 
         if (event.getAction() == MotionEvent.ACTION_MOVE) { 

          dataset.removeSeries(dataset.getSeriesCount()-1); 
          multiRenderer.removeSeriesRenderer(GraficaCuatro); 
          XYSeries Line = new XYSeries(""); 
          Line.add(seriesSelection.getXValue(),minValue); 
          Line.add(seriesSelection.getXValue(),maxValue); 
          dataset.addSeries(Line); 
          multiRenderer.addSeriesRenderer(GraficaCuatro); 
        } 
         if (event.getAction() == MotionEvent.ACTION_UP) { 

          dataset.removeSeries(dataset.getSeriesCount()-1); 
          multiRenderer.removeSeriesRenderer(GraficaCuatro); 
         } 
        } 

        mChart.repaint(); 
        return true; 
       } 
      }); 

答えて

1

垂直カーソルを描画するには、グラフに追加した一連の垂直ポイントを追加する必要があります。

chart.getCurrentSeriesAndPoint()は、選択可能なバッファの下で画面をタッチしたポイントに最も近いものを返します。だから、何かを返すなど、既存のポイントの近くで画面に触れる必要があります。いくつかの作業コードについては

chartView.setOnClickListener(...); 

を、確認してください、あなたのチャート上のタッチイベントをリッスンし、このように登録するために

renderer.setSelectableBuffer(100); 

:しかし、あなたが望む任意の値に選択可能なバッファを設定することができます公式のAChartEngineデモ、this作品がお手伝いします。

更新:もう1つの選択肢は、自分でタッチを処理し、最も近い点を見つけるためにシリーズを通して検索する必要があります。 chartView.toRealPoint()を使用して、スクリーンポイントから実際のデータポイントを取得することができます。

+0

おかげでダンを使用しています。 onClickイベントは、私が値を取得する必要があるために私のために働いていますが、私は画面に触れ、その周りに自分の指を動かしています。そのため、私はonTouchListenerを使用していますが、問題はイベント "getCurrentSeriesAndPoint()"が "return false;"という行の値だけを返すことです。その場合は1回だけ動作します。私が "return true;"という行を変更するとそれは毎回動作するようですが、決して値を返しません。 – SairSalazar

+0

コード例:mChart.setOnTouchListener(新しいビュー。OnTouchListener(){ @Override public boolean onTouch(ビューv、MotionEventイベント){ SeriesSelection seriesSelection = mChart.getCurrentSeriesAndPoint(); } がtrueを返します。 } }); – SairSalazar

+0

私の更新された答えを見てください。 –

0

イムは、この

  mChart = (GraphicalView) ChartFactory.getLineChartView(getActivity().getBaseContext(), dataset, multiRenderer); 
     mChart.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       MotionEvent motionEvent = MotionEvent.obtain(
         event.getDownTime(), 
         event.getEventTime(), 
         MotionEvent.ACTION_DOWN, 
         event.getX(), 
         event.getY(), 
         event.getMetaState() 
         ); 
       mChart.onTouchEvent(motionEvent); 
       double[]values = mChart.toRealPoint(0); 
       for(int i = 0; i < dataset.getSeriesCount(); i++) 
       { 
        try 
        { 
         if((int)values[0] < dataset.getSeriesAt(i).getItemCount()) 
         { 
          //float value = (float) dataset.getSeriesAt(i).getY((int)values[0]); 
          //Log.d("", ""); 
         } 
        } 
        catch (Exception e) { 
         // TODO: handle exception 
        } 
       } 
       if (event.getAction() == MotionEvent.ACTION_CANCEL) { 
        dataset.removeSeries(dataset.getSeriesCount()-1); 
        multiRenderer.removeSeriesRenderer(GraficaCuatro); 
       } 
       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        XYSeries Line = new XYSeries(""); 
        Line.add(values[0],minValue); 
        Line.add(values[0],maxValue); 
        dataset.addSeries(Line);  
        multiRenderer.addSeriesRenderer(GraficaCuatro); 
       } 
       if (event.getAction() == MotionEvent.ACTION_MOVE) { 

        dataset.removeSeries(dataset.getSeriesCount()-1); 
        multiRenderer.removeSeriesRenderer(GraficaCuatro); 
        XYSeries Line = new XYSeries(""); 
        Line.add(values[0],minValue); 
        Line.add(values[0],maxValue); 
        dataset.addSeries(Line);  
        multiRenderer.addSeriesRenderer(GraficaCuatro); 

       } 
       if (event.getAction() == MotionEvent.ACTION_UP) { 
        dataset.removeSeries(dataset.getSeriesCount()-1); 
        multiRenderer.removeSeriesRenderer(GraficaCuatro); 
       } 

       mChart.repaint(); 
       return true; 
      } 
     });