public
class
LineWithAnimationRenderer : Telerik.XamarinForms.ChartRenderer.iOS.CartesianChartRenderer
{
public
LineWithAnimationRenderer()
{
}
protected
override
void
UpdateNativeWidget()
{
base
.UpdateNativeWidget();
this
.Control.AllowAnimations =
true
;
}
}
public
class
LineWithAnimationDelegate : Telerik.XamarinForms.ChartRenderer.iOS.CartesianChartDelegate
{
public
LineWithAnimationDelegate()
{
}
public
override
CAAnimation AnimationForSeries(TKChart chart, TKChartSeries series, TKChartSeriesRenderState state, CGRect rect)
{
double
duration = 1;
List<CAAnimation> animations =
new
List<CAAnimation>();
for
(
int
i = 0; i < (
int
)state.Points.Count; i++)
{
string
keyPath =
string
.Format(
"seriesRenderStates.{0}.points.{1}.y"
, series.Index, i);
TKChartVisualPoint point = (TKChartVisualPoint)state.Points.ObjectAtIndex((
uint
)i);
double
oldY = rect.Height;
double
half = oldY + (point.Y - oldY) / 2.0;
CAKeyFrameAnimation a = (CAKeyFrameAnimation)CAKeyFrameAnimation.GetFromKeyPath(keyPath);
a.KeyTimes =
new
NSNumber[] {
new
NSNumber(0),
new
NSNumber(0),
new
NSNumber(1) };
a.Values =
new
NSObject[] {
new
NSNumber(oldY),
new
NSNumber(half),
new
NSNumber(point.Y) };
a.Duration = duration;
a.TimingFunction = CAMediaTimingFunction.FromName(CAMediaTimingFunction.EaseOut);
animations.Add(a);
}
CAAnimationGroup group =
new
CAAnimationGroup();
group.Duration = duration;
group.Animations = animations.ToArray();
return
group;
}
}
protected
override
Telerik.XamarinForms.ChartRenderer.iOS.CartesianChartDelegate CreateChartDelegateOverride()
{
return
new
LineWithAnimationDelegate();
}
[assembly: Xamarin.Forms.ExportRenderer(
typeof
(Telerik.XamarinForms.Chart.RadCartesianChart),
typeof
(ChartAnimations.iOS.LineWithAnimationRenderer))]
Nikolay Diyanov Diyanov is the Product Manager of the Native Mobile UI division at Progress. Delivering outstanding solutions that make developers' lives easier is his passion and the biggest reward in his work. In his spare time, Nikolay enjoys travelling around the world, hiking, sun-bathing and kite-surfing.
Find him on Twitter @n_diyanov or on LinkedIn.