Апрель 3rd, 2007 от graann

В одном из предыдущих постов я рассказывала о решении проблемы пропадающих DataTip-ов в LineSeries с нефильтрованными данными (т.е filterData=false).
Как я уже говорила проблема в строке 969 класса mx.charts.series.LineSeries.as:

if (!isNaN(v.yFilter) && !isNaN(v.xFilter))

Не буду приводить исходный код тут. Слишком много букв.
При наследовании мне пришлось не только переопределить findDataPoints, но и воспроизвести приватный метод серии formatDataTip. Фактически же изменения коснулись только findDataPoints. Я добавила ряд проверок, однако оказалось что это был не лучший выход. Здесь народ столкнулся с аналогичной проблемой и нашел гораздо более удачное, на мой взгляд, решение. В findDataPoints они избежали многочисленных проверок заменив вышеупомянутую строку

if (!isNaN(v.yFilter) && !isNaN(v.xFilter)) на
if (!isNaN(v.yNumber) && !isNaN(v.xNumber)).

Февраль 7th, 2007 от graann

При работе с чартингом, одной из осей которого является DateTimeAxis, часто возникает потребность в изменении формата отображения меток. Как я поняла в ходе общения с кодом DateTimeAxis, сам флекс не меняет формат даты в зависимости от локали. По умолчания дата отображается в формате m/d/yy. Для российского глаза такое отображение несколько непривычно. Хелп предоставляет два пути решения этой проблемы.
1. labelFunction:Function [read-write]
Called to format axis values for display as labels. A labelFunction has the following signature:

  1. function labelFunction(labelValue:Object, previousValue:Object, axis:IAxis):String


If you know the types of the data your function will be formatting, you can specify an explicit type for the labelValue and previousValue parameters.

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

2. В хелпе есть такое понятие как Protected Methods. Для человека пришедшего из AS2 и не озаботившегося ознакомлением с матчастью AS3 такое буквосочетание может показаться слабо информативным, однако белые люди сжевавшие в процессе общения с флексом уже не одну pdf-ную страницу в курсе что Protected Methods - методы класса которые можно переопределять в наследниках. Часто большинство этих методов скрыто в недрах хелпа в аккордеоне с надписью “Show Inherited Protected Methods", однако это не наш случай. Интересующие нас сейчас методы DateTimeAxis на виду:

  1. formatDays(d:Date, previousValue:Date, axis:DateTimeAxis):String
  2. formatMilliseconds(d:Date, previousValue:Date, axis:DateTimeAxis):String
  3. formatMinutes(d:Date, previousValue:Date, axis:DateTimeAxis):String
  4. formatMonths(d:Date, previousValue:Date, axis:DateTimeAxis):String
  5. formatSeconds(d:Date, previousValue:Date, axis:DateTimeAxis):String
  6. formatYears(d:Date, previousValue:Date, axis:DateTimeAxis):String

Разумеется прежде чем переопределять их в соответствии с вашими пожеланиями следует ознакомиться с исходным кодом DateTimeAxis. Там за вас уже все придумали и написали:

  1. protected function formatYears(d:Date, previousValue:Date, axis:DateTimeAxis):String
  2. {
  3.         var fy:Number = d[fullYearP];
  4.         return fy.toString();
  5. }
  6. protected function formatMonths(d:Date, previousValue:Date, axis:DateTimeAxis):String
  7. {
  8.         var fy:Number = d[fullYearP];
  9.         return (d[monthP] + 1) + "/" + ((fy % 100) < 10 ? "0" + fy % 100 : fy % 100);
  10. }
  11. protected function formatDays(d:Date, previousValue:Date, axis:DateTimeAxis):String
  12. {
  13.         var fy:Number = d[fullYearP];
  14.         return (d[monthP] + 1) + "/" + d[dateP] + "/" + ((fy % 100) < 10 ? "0" + fy % 100 : fy % 100);
  15. }
  16. protected function formatMinutes(d:Date, previousValue:Date, axis:DateTimeAxis):String
  17. {
  18.         return d[hoursP] + ":" + (d[minutesP] < 10 ? "0" + d[minutesP] : d[minutesP]);
  19. }
  20. protected function formatSeconds(d:Date, previousValue:Date, axis:DateTimeAxis):String
  21. {
  22.         return d[hoursP]+ ":" + (d[minutesP] < 10 ? "0" + d[minutesP] : d[minutesP]) + ":" + (d[secondsP] < 10 ? "0" + d[secondsP] : d[secondsP]);
  23. }

Потребуется только слегка откорректировать эти методы в соответствии с вашими пожеланиями. Или, если приложение требует некоторой гибкости, добавить к уже имеющемуся формату еще несколько форматов отображения. (в зависимости от локали)

Кстати. Если вдруг получившиеся в ходе переопределения методов метки будут натыкаться друг на друга и делать подписи абсолютно нечитаемыми следует воспользоваться методом reduceLabels(intervalStart:AxisLabel, intervalEnd:AxisLabel):AxisLabelSet, а никак не свойством interval : Number, как это может захотеться с первого взгляда. Но это уже совсем другая история…

Ноябрь 24th, 2006 от graann

Ранее я упоминала о том, что в LineChart с не фильтрованными данными отказываются демонстрироваться DataTips. Эту странность я склонна классифицировать как баг, поскольку с другими чартами такой проблемы у меня не возникло.

Суть проблемы:
При наведении мыши на рабочую область чартинга вызывается метод findDataPoints(x:Number,y:Number,sensitivity:Number):Array mx.charts.series.LineSeries, который проверяет с погрешностью sensitivity соответствие точки mouseX,mouseY пикам серии.

  1. var v:LineSeriesItem = _renderData.filteredCache[cur]
  2. if (!isNaN(v.yFilter) && !isNaN(v.xFilter))
  3. {
  4.    var dist:Number = (v.x  - x)*(v.x  - x) + (v.y - y)*(v.y -y);
  5.    if (dist <= minDist2)
  6.    {
  7.         minDist2 = dist;
  8.         minItem = v;               
  9.    }
  10. }

в строке if (!isNaN(v.yFilter) && !isNaN(v.xFilter)) на isNaN проверяются значения свойств, которые просто не создаются в случае, когда filterData=false. Происходит это в методе updateFilter():void того же LineSeries.

Решение:
Наследуем LineSeriesNew от LineSeries, в котором и переопределяем метод findDataPoints

Ноябрь 22nd, 2006 от graann

При реализации пана и зума в чартинге я столкнулась с тем, что при уходе за пределы отображаемой области какого-то из ключевых значений например значения high свечи CandlestickChart вся свеча благополучно пропадает. На LineChart в этом случае вообще без слез смотреть невозможно. И дело тут не в багах. Причиной свойство filterData серий. Собственно по умолчанию данные фильтруются, что и приводит к подобной фигне.
Однако с отключением фильтрации тоже есть некоторые сложности с одним из которых мне посчастливилось столкнуться. Дело в том что в LineChart с не фильтрованными данными отказываются демонстрироваться DataTips. О причинах и решении этой проблемы я расскажу позднее.

Ноябрь 21st, 2006 от graann

баг:
не работает hlocSeries.setStyle("closeTickStroke", color);

проблема:
строка 116 mx.charts.renderers.HLOCItemRenderer:

  1. var closeTickStroke:Stroke = getStyle("openTickStroke");

решение:
создаем свой itemRenderer в котором исправляем эту досадную описку

Graann`s blog
flash, flex и все, что придет в голову

Сентябрь 2010
Пн Вт Ср Чт Пт Сб Вс
 << <   > >>
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      

О блоге

С назначением блога можно ознакомиться здесь

Идейным вдохновителем и по совместительству куратором блога является Сonstantiner, за что ему огромный респект и уважуха! Впрочем не только за это :)

Поиск

powered by b2evolution free blog software


Design downloaded from Zeroweb.org
Website templates, layouts, and website tools for FREE!
Free short URL services from urlSNIP.