在aChartEngine中画一条线

时间:2013-02-14 17:13:50

标签: achartengine

我想在触摸图表区域的位置显示垂直光标。与此行关联的文本视图将显示该栏的值,其中的点的y轴值。当我将手指向左移动同时保持我的手指向下[左移或右移]时,此垂直光标将相应地移动并且文本视图也会跟随,但是在显示y轴值时移动时的新位置。

我看到GraphicalView有一个touchlistener,我可以注册以获得回调 - 但我从此以后如何使用它是无能为力的。我可以设法将touchevent与某种gesturelistener联系起来。但是,如何绘制叠加在当前图表顶部的垂直光标线?

我遇到的其他问题是,在onTuuch中返回true时我无法获取mChart.getCurrentSeriesAndPoint()的值; ,总是返回Null,但如果我将返回值更改为False,我可以获取值,但我无法再次访问该值。

这是我的代码

    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不正确,如果我将true更改为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;
               }
            });

2 个答案:

答案 0 :(得分:1)

为了绘制垂直光标,您必须添加一系列额外的垂直点添加到图表中。

chart.getCurrentSeriesAndPoint()将返回与您在可选缓冲区下触摸屏幕的点最接近的内容。因此,您需要触摸靠近现有点的屏幕,例如它会返回一些东西。但是,您可以将可选缓冲区设置为您想要的任何值:

renderer.setSelectableBuffer(100);

要在图表上收听触摸事件,请按以下方式注册:

chartView.setOnClickListener(...);

对于某些工作代码,请查看官方的AChartEngine演示,this部分将为您提供帮助。

更新:另一个选项必须自己处理触摸并搜索系列以找到最近的点。您可以使用chartView.toRealPoint()从屏幕点检索实际数据点。

答案 1 :(得分: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;
            }
        });