Skip to content

Commit

Permalink
Support for animating Radar charts (Closes #574)
Browse files Browse the repository at this point in the history
  • Loading branch information
danielgindi committed Jan 28, 2016
1 parent 33f30f8 commit 2459acd
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 12 deletions.
49 changes: 37 additions & 12 deletions Charts/Classes/Renderers/RadarChartRenderer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,16 @@ public class RadarChartRenderer: LineRadarChartRenderer

internal func drawDataSet(context context: CGContext, dataSet: IRadarChartDataSet)
{
guard let chart = chart else { return }
guard let
chart = chart,
animator = animator
else { return }

CGContextSaveGState(context)

let phaseX = animator.phaseX
let phaseY = animator.phaseY

let sliceangle = chart.sliceAngle

// calculate the factor that is needed for transforming the value to pixels
Expand All @@ -64,14 +70,17 @@ public class RadarChartRenderer: LineRadarChartRenderer
{
guard let e = dataSet.entryForIndex(j) else { continue }

let p = ChartUtils.getPosition(center: center, dist: CGFloat(e.value - chart.chartYMin) * factor, angle: sliceangle * CGFloat(j) + chart.rotationAngle)
let p = ChartUtils.getPosition(
center: center,
dist: CGFloat(e.value - chart.chartYMin) * factor * phaseY,
angle: sliceangle * CGFloat(j) * phaseX + chart.rotationAngle)

if (p.x.isNaN)
if p.x.isNaN
{
continue
}

if (!hasMovedToPoint)
if !hasMovedToPoint
{
CGPathMoveToPoint(path, nil, p.x, p.y)
hasMovedToPoint = true
Expand All @@ -85,7 +94,7 @@ public class RadarChartRenderer: LineRadarChartRenderer
CGPathCloseSubpath(path)

// draw filled
if (dataSet.isDrawFilledEnabled)
if dataSet.isDrawFilledEnabled
{
if dataSet.fill != nil
{
Expand All @@ -98,7 +107,7 @@ public class RadarChartRenderer: LineRadarChartRenderer
}

// draw the line (only if filled is disabled or alpha is below 255)
if (!dataSet.isDrawFilledEnabled || dataSet.fillAlpha < 1.0)
if !dataSet.isDrawFilledEnabled || dataSet.fillAlpha < 1.0
{
CGContextSetStrokeColorWithColor(context, dataSet.colorAt(0).CGColor)
CGContextSetLineWidth(context, dataSet.lineWidth)
Expand All @@ -116,9 +125,13 @@ public class RadarChartRenderer: LineRadarChartRenderer
{
guard let
chart = chart,
data = chart.data
data = chart.data,
animator = animator
else { return }

let phaseX = animator.phaseX
let phaseY = animator.phaseY

let sliceangle = chart.sliceAngle

// calculate the factor that is needed for transforming the value to pixels
Expand All @@ -143,7 +156,10 @@ public class RadarChartRenderer: LineRadarChartRenderer
{
guard let e = dataSet.entryForIndex(j) else { continue }

let p = ChartUtils.getPosition(center: center, dist: CGFloat(e.value) * factor, angle: sliceangle * CGFloat(j) + chart.rotationAngle)
let p = ChartUtils.getPosition(
center: center,
dist: CGFloat(e.value) * factor * phaseY,
angle: sliceangle * CGFloat(j) * phaseX + chart.rotationAngle)

let valueFont = dataSet.valueFont
let valueTextColor = dataSet.valueTextColor
Expand Down Expand Up @@ -189,7 +205,10 @@ public class RadarChartRenderer: LineRadarChartRenderer

for var i = 0, xValCount = data.xValCount; i < xValCount; i += xIncrements
{
let p = ChartUtils.getPosition(center: center, dist: CGFloat(chart.yRange) * factor, angle: sliceangle * CGFloat(i) + rotationangle)
let p = ChartUtils.getPosition(
center: center,
dist: CGFloat(chart.yRange) * factor,
angle: sliceangle * CGFloat(i) + rotationangle)

_webLineSegmentsBuffer[0].x = center.x
_webLineSegmentsBuffer[0].y = center.y
Expand Down Expand Up @@ -233,7 +252,8 @@ public class RadarChartRenderer: LineRadarChartRenderer
{
guard let
chart = chart,
data = chart.data as? RadarChartData
data = chart.data as? RadarChartData,
animator = animator
else { return }

CGContextSaveGState(context)
Expand All @@ -247,6 +267,9 @@ public class RadarChartRenderer: LineRadarChartRenderer
CGContextSetLineDash(context, 0.0, nil, 0)
}

let phaseX = animator.phaseX
let phaseY = animator.phaseY

let sliceangle = chart.sliceAngle
let factor = chart.factor

Expand Down Expand Up @@ -280,8 +303,10 @@ public class RadarChartRenderer: LineRadarChartRenderer
continue
}

_highlightPointBuffer = ChartUtils.getPosition(center: center, dist: CGFloat(y) * factor,
angle: sliceangle * CGFloat(j) + chart.rotationAngle)
_highlightPointBuffer = ChartUtils.getPosition(
center: center,
dist: CGFloat(y) * factor * phaseY,
angle: sliceangle * CGFloat(j) * phaseX + chart.rotationAngle)

// draw the lines
drawHighlightLines(context: context, point: _highlightPointBuffer, set: set)
Expand Down
20 changes: 20 additions & 0 deletions ChartsDemo/Classes/Demos/RadarChartViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ - (void)viewDidLoad
@{@"key": @"toggleYLabels", @"label": @"Toggle Y-Values"},
@{@"key": @"toggleRotate", @"label": @"Toggle Rotate"},
@{@"key": @"toggleFill", @"label": @"Toggle Fill"},
@{@"key": @"animateX", @"label": @"Animate X"},
@{@"key": @"animateY", @"label": @"Animate Y"},
@{@"key": @"animateXY", @"label": @"Animate XY"},
@{@"key": @"spin", @"label": @"Spin"},
@{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}
];
Expand Down Expand Up @@ -65,6 +68,8 @@ - (void)viewDidLoad
l.yEntrySpace = 5.0;

[self setData];

[_chartView animateWithXAxisDuration:1.4 yAxisDuration:1.4 easingOption:ChartEasingOptionEaseOutBack];
}

- (void)didReceiveMemoryWarning
Expand Down Expand Up @@ -160,6 +165,21 @@ - (void)optionTapped:(NSString *)key
[_chartView setNeedsDisplay];
}

if ([key isEqualToString:@"animateX"])
{
[_chartView animateWithXAxisDuration:1.4];
}

if ([key isEqualToString:@"animateY"])
{
[_chartView animateWithYAxisDuration:1.4];
}

if ([key isEqualToString:@"animateXY"])
{
[_chartView animateWithXAxisDuration:1.4 yAxisDuration:1.4];
}

if ([key isEqualToString:@"spin"])
{
[_chartView spinWithDuration:2.0 fromAngle:_chartView.rotationAngle toAngle:_chartView.rotationAngle + 360.f easingOption:ChartEasingOptionEaseInCubic];
Expand Down
18 changes: 18 additions & 0 deletions ChartsDemo/Classes/RealmDemos/RealmRadarChartViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ - (void)viewDidLoad
@{@"key": @"toggleYLabels", @"label": @"Toggle Y-Values"},
@{@"key": @"toggleRotate", @"label": @"Toggle Rotate"},
@{@"key": @"toggleFill", @"label": @"Toggle Fill"},
@{@"key": @"animateX", @"label": @"Animate X"},
@{@"key": @"animateY", @"label": @"Animate Y"},
@{@"key": @"animateXY", @"label": @"Animate XY"},
@{@"key": @"spin", @"label": @"Spin"},
@{@"key": @"saveToGallery", @"label": @"Save to Camera Roll"}
];
Expand Down Expand Up @@ -134,6 +137,21 @@ - (void)optionTapped:(NSString *)key
[_chartView setNeedsDisplay];
}

if ([key isEqualToString:@"animateX"])
{
[_chartView animateWithXAxisDuration:1.4];
}

if ([key isEqualToString:@"animateY"])
{
[_chartView animateWithYAxisDuration:1.4];
}

if ([key isEqualToString:@"animateXY"])
{
[_chartView animateWithXAxisDuration:1.4 yAxisDuration:1.4];
}

if ([key isEqualToString:@"spin"])
{
[_chartView spinWithDuration:2.0 fromAngle:_chartView.rotationAngle toAngle:_chartView.rotationAngle + 360.f easingOption:ChartEasingOptionEaseInCubic];
Expand Down

0 comments on commit 2459acd

Please sign in to comment.