【问题标题】:Draw a Line in aChartEngine在图表引擎中画一条线
【发布时间】:2013-02-14 17:13:49
【问题描述】:

我想在我触摸图表区域的位置显示一个垂直光标。与此行关联的文本视图将显示条形的值以及其中点的 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;
               }
            });

【问题讨论】:

    标签: achartengine


    【解决方案1】:

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

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

    renderer.setSelectableBuffer(100);
    

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

    chartView.setOnClickListener(...);
    

    对于一些工作代码,请查看官方 AChartEngine 演示,this 将帮助您。

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

    【讨论】:

    • 谢谢丹。 onClick 事件对我不起作用,因为我需要在触摸屏幕并在其周围移动手指时获取值。这就是我使用 onTouchListener 的原因,问题是事件“getCurrentSeriesAndPoint()”只返回带有“return false;”行的值但在这种情况下,它只能工作一次。如果我更改“return true;”的行它似乎每次都有效,但它从不返回值。
    • 代码示例: mChart.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { SeriesSelection seriesSelection = mChart.getCurrentSeriesAndPoint(); } return true; } } );
    • 再次感谢丹,现在我正在努力,它运行良好,我已经可以在 mChart.getCurrentSeriesAndPoint(); ...唯一的问题是 X 值始终为 0.0 ...如果您能帮我解决这个问题,我将不胜感激...很抱歉打扰您,但我真的需要完成这个项目。萨维德。
    【解决方案2】:

    我用这个

             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;
                }
            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多