SciChart TradeChartAxisLabelProvider настраиваемое форматирование для отображения дней, месяцев - PullRequest
0 голосов
/ 14 февраля 2019

Как настроить ось X для отображения дней (или месяцев, или лет, в зависимости от выбранного диапазона), где начинается новый день / месяц / год?Я использую CategoryDateAxis ( CreateMultiPaneStockChartsFragment пример ).

Что я хочу:

Большие диапазоны:

enter image description here

Меньшие диапазоны (легкоПосмотрите, где начинается новый день):

enter image description here

Что у меня есть:

Сейчас я использую по умолчаниюПоставьте ярлык на провайдера, и трудно понять, когда начинается новый день / месяц / год.Например, для 7-дневного диапазона:

enter image description here

Ось построена так:

final CategoryDateAxis xAxis = sciChartBuilder.newCategoryDateAxis()
                .withVisibility(isMainPane ? View.VISIBLE : View.GONE)
                .withVisibleRange(sharedXRange)
                //.withLabelProvider(new TradeChartAxisLabelProviderDateTime())
                .withGrowBy(0.01d, 0.01d)
                .build();

Как мне этого добиться?

public static class TradeChartAxisLabelProviderDateTime extends TradeChartAxisLabelProvider {
    public TradeChartAxisLabelProviderDateTime() {
        super();
    }

    @Override
    public String formatLabel(Comparable dataValue) {
        if(currentRange == RANGE_1_YEAR) {

        } else if(currentRange == RANGE_1_MONTH) {

        } else if(currentRange == RANGE_1_DAY) {

        }
        String text = super.formatLabel(dataValue).toString();
        return text;
    }
}

1 Ответ

0 голосов
/ 15 февраля 2019

Для реализации выбора метки на основе VisibleRange вы можете использовать код, подобный следующему:

public static class TradeChartAxisLabelProviderDateTime extends TradeChartAxisLabelProvider {
    public TradeChartAxisLabelProviderDateTime() {
        super(new TradeChartAxisLabelFormatterDateTime());
    }

    private static class TradeChartAxisLabelFormatterDateTime implements ILabelFormatter<CategoryDateAxis> {
        private final SimpleDateFormat labelFormat, cursorLabelFormat;

        private TradeChartAxisLabelFormatterDateTime() {
            labelFormat = new SimpleDateFormat(CategoryDateAxis.DEFAULT_TEXT_FORMATTING, Locale.getDefault());
            cursorLabelFormat = new SimpleDateFormat(CategoryDateAxis.DEFAULT_TEXT_FORMATTING, Locale.getDefault());
        }

        @Override
        public void update(CategoryDateAxis axis) {
            final ICategoryLabelProvider labelProvider = Guard.instanceOfAndNotNull(axis.getLabelProvider(), ICategoryLabelProvider.class);

            // this is range of indices which are drawn by CategoryDateAxis
            final IRange<Double> visibleRange = axis.getVisibleRange();

            // convert indicies to range of dates
            final DateRange dateRange = new DateRange(
                    ComparableUtil.toDate(labelProvider.transformIndexToData((int) NumberUtil.constrain(Math.floor(visibleRange.getMin()), 0, Integer.MAX_VALUE))),
                    ComparableUtil.toDate(labelProvider.transformIndexToData((int) NumberUtil.constrain(Math.ceil(visibleRange.getMax()), 0, Integer.MAX_VALUE))));

            if (dateRange.getIsDefined()) {
                long ticksInViewport = dateRange.getDiff().getTime();

                // select formatting based on diff in time between Min and Max
                if (ticksInViewport > DateIntervalUtil.fromYears(1)) {
                    // apply year formatting
                    labelFormat.applyPattern("");
                    cursorLabelFormat.applyPattern("");
                } else if (ticksInViewport > DateIntervalUtil.fromMonths(1)) {
                    // apply month formatting
                    labelFormat.applyPattern("");
                    cursorLabelFormat.applyPattern("");
                } else if (ticksInViewport > DateIntervalUtil.fromMonths(1)) {
                    // apply day formatting
                    labelFormat.applyPattern("");
                    cursorLabelFormat.applyPattern("");
                }
            }
        }

        @Override
        public CharSequence formatLabel(Comparable dataValue) {
            final Date valueToFormat = ComparableUtil.toDate(dataValue);
            return labelFormat.format(valueToFormat);
        }

        @Override
        public CharSequence formatCursorLabel(Comparable dataValue) {
            final Date valueToFormat = ComparableUtil.toDate(dataValue);
            return cursorLabelFormat.format(valueToFormat);
        }
    }
}

В update () вы можете получить доступ к VisibleRange оси и на основании этого выбратьформатирование меток, а затем используйте SimpleDateFormat для форматирования дат.

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

...