2016-11-27 4 views
0

Я реализовал AndroidPlot в своем приложении, и он отлично работает, но мне нужно первое значение на один шаг после начала, так как дата не ясна.Как перенести первую метку домена на один шаг из источника

Я попробовал предложенное решение в заданные вопросы here, где они добавляют метод setDomainValueFormat однако сообщение об ошибке отображается:

"метод не может решить"

andriodplot

Любой предложение о том, как начать домен x axis на один шаг после начала?

plot = (XYPlot) findViewById(R.id.plot); 

     XYSeries series = new SimpleXYSeries(Arrays.asList(dates_in_m_seconds), Arrays.asList(values_as_numbers), "BP Status"); 

     LineAndPointRenderer and configure them 
     LineAndPointFormatter seriesFormat = new LineAndPointFormatter(Color.RED, Color.GREEN,null, null); 


       plot.addSeries(series, seriesFormat); 

     // Specify x and y axes labels amount 
     plot.setRangeStep(StepMode.SUBDIVIDE,3); 
     plot.setDomainStep(StepMode.SUBDIVIDE,dates.size()); 

       plot.getGraph().getLineLabelStyle(XYGraphWidget.Edge.BOTTOM).setFormat(new Format() { 
      @Override 

      public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) { 


       Date date_Label = new Date(Math.round(((Number) obj).doubleValue())); 

       return format.format(date_Label, toAppendTo, pos); 
      } 

      @Override 
      public Object parseObject(String source, ParsePosition pos) { 
       return null; 
      } 
     }); 



     plot.getGraph().getLineLabelStyle(XYGraphWidget.Edge.LEFT).setFormat(new Format() { 


      @Override 

      public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) { 

       Number num = (Number) obj; 
       switch (num.intValue()) { 
        case 0: 
         toAppendTo.append("Low"); 
         break; 
        case 1: 
         toAppendTo.append("Normal"); 
         break; 
        case 2: 
         toAppendTo.append("High"); 
         break; 

        default: 
         toAppendTo.append("Unknown"); 
         break; 
       } 
       return toAppendTo; 

      } 

      @Override 
      public Object parseObject(String source, ParsePosition pos) { 
       return null; 
      } 
     }); 


      } 
+0

Так что вы хотите перенести свои значения домена к правой один шаг, так что домен и диапазон метки элемента 0,0 не пересекаются, верно? Также можете ли вы отправить свой код, который создает экземпляр XYSeries? – Nick

+0

да, это я имею в виду, можете ли вы проверить код, я обновляю сообщение с помощью xy series @Nick – user873101

ответ

0

Есть несколько способов решения этой проблемы. На первый взгляд кажется, что сохранение строгого равномерного интервала между xVals желательно, однако, поскольку ваши xVals являются не только метками времени, но и округлыми версиями исходных входов, вы получите приблизительный равномерный интервал. Если вы хотите полностью решить эту проблему, вы можете создать экземпляр своего XYSeries с помощью Y_VALS_ONLY, а затем использовать date_as_m_seconds в качестве таблицы поиска для визуализации ярлыков в экземпляре домена.

Сказав это, я включил решение, которое должно работать с вашим существующим кодом. Я не пытаюсь скомпилировать или запустить его, поэтому могут быть опечатки, но общая идея будет работать:

  1. вручную установить границы домена Вашего участка, чтобы включить некоторое дополнительное пространство перед первым элементом в данных временных меток.
  2. Когда вы подразделить область домена, добавить дополнительный элемент, чтобы освободить место для нового невидимого шага
  3. Измените домен экземпляр сформатируйте пропустить значения < первой метку времени в данных, эффективно делая новый первый элемент невидим ,

Код:

  // this value must be final in order to be visible to the anonymous inner class instance 
      // of Format below. Note that this will fail miserably if you try to plot a series of 
      // size < 2. 
      final double firstX = Math.round(((Number) series.getX(0)).doubleValue()); 
      double secondX = Math.round(((Number) series.getX(1)).doubleValue()); 
      double lastX = Math.round(((Number) series.getX(series.size() - 1)).doubleValue()); 

      // assuming the step interval is uniform, this is the distance between each xVal: 
      double stepInterval = secondX - firstX; 

      // add in extra space for the first "invisible index" by setting the starting 
      // domain boundary exactly one interval before the first actual element: 
      plot.setDomainBoundaries(firstX - stepInterval, lastX, BoundaryMode.FIXED); 

      // add an extra "invisible index": 
      plot.setDomainStep(StepMode.SUBDIVIDE,dates.size() + 1); 

      ... 

      plot.getGraph().getLineLabelStyle(XYGraphWidget.Edge.BOTTOM).setFormat(new Format() { 

       @Override 
       public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) { 
        double timestampMs = Math.round(((Number) obj).doubleValue()); 

        // only render indices corresponding to values in the series: 
        if(timestampMs >= firstX) { 
         Date date_Label = new Date(); 
         return format.format(date_Label, toAppendTo, pos); 
        } 
       } 

       @Override 
       public Object parseObject(String source, ParsePosition pos) { 
        return null; 
       } 
      }); 
+0

Привет, спасибо за вашу помощь, однако, когда я попробовал ваше предложение, отображение ошибки для статического типа отображает ошибку с модификатором static not allowed здесь @Nick – user873101

+0

моя ошибка - должна была быть окончательной, а не статичной. исправлено. – Nick

+0

спасибо, много это работает =) – user873101

 Смежные вопросы

  • Нет связанных вопросов^_^