2013-02-14 20 views
5

में कोई रेखा खींचें मैं एक ऊर्ध्वाधर कर्सर स्थान जहां मैं चार्ट क्षेत्र स्पर्श पर दिखाने के लिए करना चाहते हैं। इस पंक्ति से जुड़ा एक टेक्स्टव्यू बार के मान को उस बिंदु के वाई-अक्ष मान को प्रदर्शित करेगा। और जब मैं अपनी अंगुली को बाएं हाथ में रखता हूं, जबकि मेरी उंगली नीचे [बाएं-चाल या दाएं स्थानांतरित] रखते हैं, तो यह लंबवत कर्सर तदनुसार आगे बढ़ेगा और टेक्स्टव्यू भी साथ ही पालन करेगा लेकिन y-axis मान प्रदर्शित करेगा नया स्थान (जैसे) यह चलता है।aChartEngine

मुझे लगता है कि GraphicalView एक touchlistener कि मैं कॉलबैक प्राप्त करने के लिए रजिस्टर कर सकते हैं है - लेकिन मैं उस समय के बाद से है कि उपयोग करने के लिए कैसे अनजान हूँ। मैं टचचेन्ट को किसी प्रकार के जेस्चरलिस्टर से भी जोड़ सकता हूं। लेकिन मैं वर्टिकल कर्सर लाइन कैसे आकर्षित करूं जो ओवरले वर्तमान चार्ट के शीर्ष पर जाती है?

अन्य समस्या यह है कि मैं एक सच्चे मैं mChart.getCurrentSeriesAndPoint के मूल्यों नहीं मिल सकता है लौटने जब() onTuuch में, है है; , हमेशा नल लौटें, लेकिन अगर मैं झूठी वापसी पर बदलता हूं तो मैं मूल्य प्राप्त कर सकता हूं लेकिन मैं फिर से पहुंच नहीं सकता।

यह मेरा कोड

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 कृपया मुझे मदद की जरूरत है!

संपादित करें: यह मेरा onTouch कोड जब मैं सच वापसी है; टच में, रीयलपॉइंट() से मूल्य; और श्रृंखला चयन गलत हैं, अगर मैं गलत में बदलता हूं तो मैं वास्तविक मान प्राप्त कर सकता हूं। कृपया

  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

धन्यवाद दान। ऑनक्लिक घटना मेरे लिए काम नहीं करती है क्योंकि मुझे स्क्रीन को छूने और अपनी अंगुली को चारों ओर ले जाने के दौरान मूल्यों को प्राप्त करने की आवश्यकता है। यही कारण है कि मैं ऑन टचलिस्टर का उपयोग कर रहा हूं, समस्या यह है कि "getCurrentSeriesAndPoint()" घटना पर केवल "वापसी झूठी" पंक्ति के साथ मान देता है; लेकिन उस मामले में यह केवल एक बार काम करता है। अगर मैं "सच वापसी" के लिए रेखा बदलता हूं ऐसा लगता है कि हर बार काम करता है लेकिन यह मूल्य कभी नहीं देता है। – SairSalazar

+0

कोड उदाहरण: mChart.setOnTouchListener (नया दृश्य।ऑन टच लिस्टनर() { @ ओवरराइड सार्वजनिक बूलियन ऑन टच (देखें वी, मोशनवेवेंट इवेंट) { श्रृंखला चयन श्रृंखला चयन = mChart.getCurrentSeriesAndPoint(); } सत्य लौटें; } }); – 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; 
      } 
     });