Как анимировать круговые диаграммы, разработанные с использованием библиотеки core-plot?

В приложении Roambi для iPhone показанная круговая диаграмма может быть анимирована для вращения вместе с пользователем, как если бы он вращал диск. Мы можем удерживать и делать с этим много чего.

Кто-то упомянул, что приложение Roambi было разработано с использованием библиотеки core-plot:

Какая библиотека использует приложение Roambi для iPhone для рисования диаграмм?

Как я могу управлять круговой диаграммой, разработанной с использованием Core plot?


person Krishnan    schedule 09.03.2011    source источник
comment
Если вы просто делаете круговые диаграммы, вы можете попробовать XYPieChart. У него есть анимация, и он выглядит лучше (на мой взгляд), чем CorePlot.   -  person Dan Tao    schedule 25.06.2012


Ответы (3)


Беглый взгляд на исходный код Core Plot показывает, что наследование CPPieChart выглядит так:

CPPieChart: CPPlot: CPAnnotationHostLayer: CPLayer: CALayer

Итак, вы можете видеть, что, в конце концов, CPPieChart - это всего лишь сильно подклассифицированный CALayer. Я могу ошибаться здесь, но нет ничего, что указывало бы на то, что это нельзя анимировать, как любой другой CALayer. Попробуйте использовать следующий код, чтобы повернуть слой на 360 градусов:

CABasicAnimation *rotation = [CABasicAnimation animationWithKeyPath:@"transform"];
CATransform3D transform = CATransform3DMakeRotation(DegreesToRadians(360), 0, 0, 1);
rotation.toValue = [NSValue valueWithCATransform3D:transform];
rotation.duration = 10.0f;
[pieChart addAnimation:rotation forKey:@"rotation"];

Если вы можете заставить это работать, то это просто вопрос считывания значений с акселерометра и преобразования их в углы поворота.

person indragie    schedule 06.04.2011

Для простой круговой диаграммы даже с вышеупомянутой анимацией Core Plot не требуется. Если вам нужно только решение Core Plot, проигнорируйте этот ответ. Однако вот простое решение, которое не требует внешних пакетов или даже каких-либо фреймворков.

Создайте UIView под названием PieChartView. В PieChartView.h:

#import <UIKit/UIKit.h>

@interface PieChartView : UIView {
    float zeroAngle;
    NSMutableArray *valueArray;
    NSMutableArray *colorArray;
}
@property (nonatomic) float zeroAngle;
@property (nonatomic, retain) NSMutableArray *valueArray;
@property (nonatomic, retain) NSMutableArray *colorArray;
@end

Затем реализация в PieChartView.m:

#import "PieChartView.h"

@implementation PieChartView
@synthesize zeroAngle;
@synthesize valueArray, colorArray;

- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
    }
    return self;
}


- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();

    // DETERMINE NUMBER OF WEDGES OF PIE
    int wedges = [valueArray count];
    if (wedges > [colorArray count]) {
        NSLog(@"INSUFFICENT COLORS FOR PIE CHART: Please add %d additional colors.",wedges-[colorArray count]);
        for (int i=[colorArray count] ; i<wedges ; ++i) {
            [colorArray addObject:[UIColor whiteColor]];
        }
    }

    // DETERMINE TOTAL VOLUME OF PIE
    float sum = 0.0;
    for (int i=0; i<wedges ; ++i) {
        sum += [[valueArray objectAtIndex:i] floatValue];
    }
    float frac = 2.0*M_PI/sum;

    // DETERMINE CENTER AND MAXIMUM RADIUS OF INSCRIBED CIRCLE
    int center_x = rect.size.width/2.0;
    int center_y = rect.size.height/2.0;
    int radius = (center_x > center_y ? center_x : center_y);

    // DRAW WEDGES CLOCKWISE FROM POSITIVE X-AXIS
    float startAngle=zeroAngle;
    float endAngle=zeroAngle;
    for (int i=0; i<wedges; ++i) {
        startAngle = endAngle;
        endAngle += [[valueArray objectAtIndex:i] floatValue]*frac;
        [[colorArray objectAtIndex:i] setFill];
        CGContextMoveToPoint(context, center_x, center_y);
        CGContextAddArc(context, center_x, center_y, radius, startAngle, endAngle, 0);
        CGContextClosePath(context);
        CGContextFillPath(context);
    }
}

- (void)dealloc {
    [valueArray release];
    [colorArray release];
    [super dealloc];
}
@end

Теперь вы можете привязать float zeroAngle к акселерометру любым способом, которым хотите добиться желаемой анимации.

person PengOne    schedule 01.04.2011

Я не знал CorePlot, и в ближайшем будущем он может мне пригодиться, поэтому я просто взглянул на него. CorePlot интересен и активен.

Относительно анимации с CorePlot:

  1. В документации CorePlot упоминается система анимации, но это еще не реализовано ...
  2. Даже если он основан на Core Animation, это не означает, что график CorePlot можно будет легко анимировать.

Интересное чтение по этой теме в группах Google.

Итак, вот ваши варианты (в моем порядке предпочтений):

  1. Поищите другую библиотеку построения графиков, обрабатывающую анимацию, как это делает Роамби.
  2. Реализуйте свои анимации на основе CorePlot (означает хорошее понимание этого фреймворка и Core Animation)
  3. Делай все сам, в зависимости от того, чего хочешь, опять же, может быть не так уж и сложно ... Но опять же нужны Core Animation навыки.

Я сомневаюсь, что Roambi использует CorePlot, но если они это сделают, они используют его в качестве основы с ТОННАМИ пользовательского внутреннего кода ...

person Vincent Guerci    schedule 02.04.2011
comment
@PengOne, спасибо, что отредактировали мою плохую грамматику, английский явно не мой основной язык;) - person Vincent Guerci; 05.04.2011