【问题标题】:OnLongClickListener not working with achartengineOnLongClickListener 不适用于 chartengine
【发布时间】:2012-07-02 23:37:15
【问题描述】:

我正在使用 achartengine,当我长按图表时,我想在操作栏中激活操作模式。但是 OnLongClickListener 不起作用,我到处搜索我几乎尝试了所有东西,但我无法让它工作,我不知道为什么。这是我的代码:

mChartView.setLongClickable(true);
mChartView.setOnLongClickListener(new OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {
            Log.i("ClickListener", "CLICK");
            return false;
        }

});

但该事件从未被调用,我认为这是因为图表可滚动但没有意义。我试过 whit OnClick 也不起作用。唯一有效的是 OnTouch,但我无法获得 Long-Press 的行为。

编辑:

或者也许是获取触摸屏状态的实际状态的任何方式,通过这种方式,我可以放置一个“计时器”,直到它达到例如 1000 毫秒,但只有在触摸屏被触摸时,因为在 onTouch 事件中我可以只知道事件发生时触摸屏的状态,不管是当前状态。

好的,这里有一些折线图的代码:

private static XYSeries input1;
private static XYMultipleSeriesDataset mDataset;
private static XYSeriesRenderer renderer1;
private static XYMultipleSeriesRenderer mRenderer;
private static GraphicalView mChartView;

mRenderer = new XYMultipleSeriesRenderer();
        renderer1 = new XYSeriesRenderer();

        mRenderer.setOrientation(Orientation.HORIZONTAL);
        mRenderer.addSeriesRenderer(renderer1);
        mRenderer.setXAxisMax(10);
        mRenderer.setYAxisMax(10);
        mRenderer.setAxesColor(Color.WHITE);
        mRenderer.setLabelsColor(Color.WHITE);
        mRenderer.setShowGrid(true);

        input1 = new XYSeries("Linea");

        mDataset = new XYMultipleSeriesDataset();
        mDataset.addSeries(input1);

        renderer1.setColor(Color.WHITE);

        input1.add(4, 7);   
        input1.add(7, 3);   
        input1.add(8, 6);   
        input1.add(9, 2);

        mChartView = ChartFactory.getLineChartView(this, mDataset, mRenderer);
        setContentView(mChartView);

        mChartView.setLongClickable(true);
        mChartView.setOnLongClickListener(new OnLongClickListener() {

            @Override
            public boolean onLongClick(View v) {
                Log.i("Click", "LONG CLICKED CHART");
                return false;
            }

        });

我正在尝试使用 onTouch 进​​行长按,因为我意识到如果我滑动图表,它也会被视为长按,所以如果我不滑动,我必须长按但图表。

【问题讨论】:

  • 您是否也在同一个视图上设置了 onTouchListener?如果可以,您也可以发布代码吗?
  • 不,我只有 OnLongClickListener。

标签: android achartengine onlongclicklistener


【解决方案1】:

您可以将runnable 与onTouchListener() 结合使用,以获得与onLongClick() 相同的效果。应该这样做:

boolean fingerStillDown = false;
final Runnable longClickRun = new Runnable(){
   public void run(){
       if(fingerStillDown){
           Log.i("CHARTS!", "LONGCLICK!");
       }
   }
 };
 mChartView.setOnTouchListener(new OnTouchListener() {
     public boolean onTouch(View v, MotionEvent me){
         if(me.getAction() == MotionEvent.ACTION_DOWN){
              fingerStillDown = true;
              //The system registers longclick at ~500ms.
              mChartView.postDelayed(longClickRun, 500);
         }

         if(me.getAction() == MotionEvent.ACTION_UP){
             fingerStillDown = false;
         }


         return false; //<-- I didn't test with true, but I suspect returning true
                       // would break the scrolling.
         }
  });

【讨论】:

  • 我用简单的折线图创建了一个新活动,但不起作用:/
  • 嗯,你能发布一些可以创建折线图的工作代码吗?我对 aChartEngine 不熟悉,现在无法制作折线图。我认为您最好的选择是使用带有计时器的 touchListener,就像您在编辑中所说的那样。如果您发布一些有效的折线图代码,我可以帮助您正确实现 touchListener。
  • @Andres 看到我编辑的答案。对不起,我昨晚没有把它贴出来。此方法适用于您提供的示例代码。
  • 感谢它完美运行,我对其进行了一些调整以避免在滚动图表时长按:) 我不知道 postDelayed()
  • 很高兴我能帮上忙。 Handler 对象也有一个 postDelayed() 方法。以防您需要该功能但手头没有 View。
【解决方案2】:

尝试返回 true 而不是 false。这样元素就被长按了,所以事件就处理好了。

mChartView.setOnLongClickListener(new OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {
            Log.i("ClickListener", "CLICK");
            return true;
        }

});

【讨论】:

  • 如果这是他的问题,我想他仍然会看到日志声明。
  • 看看this,我认为这可能会有所帮助。您也可以查看官方示例here
猜你喜欢
  • 2011-07-26
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多