2013-02-14 5 views
5

차트 영역을 터치하는 위치에 세로 커서가 나타나게하고 싶습니다. 이 선과 연관된 텍스트 뷰는 막대의 값을 그 점의 y 축 값으로 표시합니다. 그리고 손가락을 왼쪽으로 움직이면서 (왼쪽 이동 또는 오른쪽 이동),이 수직 커서는 그에 따라 움직일 것이고 텍스트 뷰는 마찬가지로 따라 가면서 y 축 값을 새 위치가 움직일 때.aChartEngine에서 선 그리기

GraphicalView에 콜백을 받기 위해 등록 할 수있는 touchlistener가 있음을 알았지 만, 그 시점부터 그 사용법을 알지 못합니다. 나는 touchevent를 일종의 gesturelistener와 연관시킬 수있다. 하지만 오버레이가 현재 차트 위에 올라가는 수직 커서 선을 그리려면 어떻게해야합니까?

다른 문제는 onTuuch true를 반환 할 때 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 제발 도와주세요!

편집 : 이것은 True를 반환 할 때 내 onTouch 코드입니다. onTouch에서 toRealPoint()의 값; 및 SeriesSelection 잘못된 경우, 내가 사실 값을 얻을 수 false로 변경 사실. 도와주세요

  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()은 선택 가능한 버퍼 아래에서 화면을 터치 한 지점에 가장 가까운 항목을 반환합니다. 그래서, 당신이 뭔가를 반환 같은 기존의 지점에 가까운 화면을 터치해야합니다.

는 다음과 같이 등록 차트에 터치 이벤트를 수신하기 위해
renderer.setSelectableBuffer(100); 

:

chartView.setOnClickListener(...); 

일부 작업 코드의 경우를 확인하지만, 당신은 당신이 원하는 값으로 선택 버퍼를 설정할 수 있습니다 공식 AChartEngine 데모, this 조각 당신을 도울 것입니다.

업데이트 : 다른 옵션은 직접 터치를 처리하고 시리즈를 검색하여 가장 가까운 지점을 찾아야합니다. chartView.toRealPoint()을 사용하여 화면 지점에서 실제 데이터 포인트를 검색 할 수 있습니다.

+0

감사 단을 사용합니다. onClick 이벤트는 나를 위해 작동하지 않습니다. 왜냐하면 화면을 터치하고 손가락을 움직이는 동안 값을 가져와야하기 때문입니다. 그게 내가 onTouchListener를 사용하는 이유입니다. 문제는 "getCurrentSeriesAndPoint()"이벤트가 "return false;"라는 값만 반환한다는 것입니다. 하지만이 경우에는 한 번만 작동합니다. "return true;"에 대한 라인을 변경하면 매번 작동하는 것처럼 보이지만 절대 값을 반환하지 않습니다. – SairSalazar

+0

코드 예 : mChart.setOnTouchListener (새보기.OnTouchListener() { @Override public boolean onTouch (뷰 v, MotionEvent 이벤트) { SeriesSelection seriesSelection = mChart.getCurrentSeriesAndPoint(); } return 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; 
      } 
     });