5

我想在我触摸图表区域的位置显示一个垂直光标。与此行关联的文本视图将显示条形的值以及其中点的 y 轴值。当我将手指移到右边的同时保持手指向下[左移或右移]时,这个垂直光标会相应地移动,文本视图也会随之移动,但会显示 y 轴值移动时的新位置。

我看到 GraphicalView 有一个触摸监听器,我可以注册它以获取回调 - 但从那时起我不知道如何使用它。我也可以设法将 touchevent 与某种手势监听器相关联。但是我如何绘制覆盖在当前图表顶部的垂直光标线?

我遇到的其他问题是,在 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;
               }
            });

我很想要这个。

矮人
(来源:subirimagenes.com

请我需要帮助!

编辑:这是我的 onTouch 代码,当我返回 True 时;在 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;
               }
            });
4

2 回答 2

1

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

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

renderer.setSelectableBuffer(100);

为了监听图表上的触摸事件,像这样注册:

chartView.setOnClickListener(...);

对于一些工作代码,查看官方 AChartEngine 演示,这篇文章会帮助你。

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

于 2013-02-14T18:16:28.353 回答
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;
            }
        });
于 2013-04-10T15:17:45.190 回答