RadCartesianChartView plots data points in a coordinate system defined by its two axes. Usually, one data point has category and value, which define its Cartesian coordinates. This means that your chart will need one axis that can visualize the category and another which can visualize the value. CartesianAxis is the base class for all axes that RadCartesianChartView can plot.
The axes that can be used to visualize the category of a data point are:
Calendar
.The axes that can be used to visualize the value of a data point extend the NumericalAxis class. They are:
Each axis several important properties that developers can use to customize their axis as required. These properties can be either visual or functional. Here is a list of all properties that can be set on an Axis object: LabelFont LabelMargin LabelTextColor LabelFontStyle LabelSize LabelValueToStringConverter LabelRotationAngle LastLabelVisibility LabelFormat MajorTickOffset LabelOffset ShowLabels LabelFitMode LabelLayoutMode TickThickness TickColor LabelInterval LabelRenderer
Below is a description with examples of several properties which accept complex objects instead of simple values.
This is an interface that can be used to convert the actual label to value to an arbitrary string before rendering.
LinearAxis axis = new LinearAxis();
axis.setLabelValueToStringConverter(new Function<Object, String>() {
@Override
public String apply(Object argument) {
Double labelValue = ((MajorTickModel)argument).value();
// Insert formatting logic here.
String format = "Value is: %s";
return String.format(format, labelValue);
}
});
LinearAxis verticalAxis = new LinearAxis();
verticalAxis.LabelValueToStringConverter = new LabelValueConverter();
private class LabelValueConverter : Java.Lang.Object, IFunction
{
public Java.Lang.Object Apply(Java.Lang.Object argument)
{
double labelValue = (argument.JavaCast<MajorTickModel>()).Value();
String format = "Value is: {0}";
return String.Format(format, labelValue);
}
}
An interface that allows developers to swap the label rendering with their own implementation.
public class MyLabelRenderer extends CartesianAxisLabelRenderer {
public MyLabelRenderer(CartesianAxis axis) {
super(axis);
}
@Override
protected void renderLabelNoFitMode(Canvas canvas, RadRect layoutSlot, String labelContent, AxisLabelModel labelModel) {
// Draw something only when label fit mode is NONE
Paint pink = new Paint();
pink.setColor(Color.parseColor("#ff69b4"));
canvas.drawRect(Util.convertToRectF(layoutSlot), pink);
super.renderLabelNoFitMode(canvas, layoutSlot, labelContent, labelModel);
}
@Override
protected void renderLabelMultiLine(Canvas canvas, RadRect layoutSlot, String labelContent, AxisLabelModel labelModel) {
// Draw something only when label fit mode is MULTILINE
Paint khaki = new Paint();
khaki.setColor(Color.parseColor("#F0E68C"));
canvas.drawRect(Util.convertToRectF(layoutSlot), khaki);
super.renderLabelMultiLine(canvas, layoutSlot, labelContent, labelModel);
}
@Override
protected void renderLabelRotate(Canvas canvas, RadRect layoutSlot, String labelContent, AxisLabelModel labelModel) {
// Draw something only when label fit mode is ROTATE
Paint moccasin = new Paint();
moccasin.setColor(Color.parseColor("#ffe4b5"));
canvas.drawRect(Util.convertToRectF(layoutSlot), moccasin);
super.renderLabelRotate(canvas, layoutSlot, labelContent, labelModel);
}
@Override
public void renderLabel(Canvas canvas, ChartNode dataPoint) {
// Always draw something before the given label is drawn.
super.renderLabel(canvas, dataPoint);
}
@Override
public RadSize measureLabel(AxisLabelModel label, Object content) {
// Plug some logic when the label is being measured.
return super.measureLabel(label, content);
}
}
public class MyLabelRenderer : CartesianAxisLabelRenderer
{
public MyLabelRenderer(CartesianAxis axis):base(axis)
{
}
protected override void RenderLabelNoFitMode(Android.Graphics.Canvas canvas,
RadRect p1, string p2, AxisLabelModel p3)
{
// Draw something only when label fit mode is None
Paint pink = new Paint();
pink.Color = Color.ParseColor("#ff69b4");
canvas.DrawRect(new RectF((float)p1.GetX(), (float)p1.GetY(), (float)p1.Right, (float)p1.Bottom), pink);
base.RenderLabelNoFitMode(canvas, p1, p2, p3);
}
protected override void RenderLabelMultiLine(Canvas canvas, RadRect p1, string p2, AxisLabelModel p3)
{
// Draw something only when label fit mode is Multiline
Paint khaki = new Paint();
khaki.Color = Color.ParseColor("#f0e68c");
canvas.DrawRect(new RectF((float)p1.GetX(), (float)p1.GetY(), (float)p1.Right, (float)p1.Bottom), khaki);
base.RenderLabelMultiLine(canvas, p1, p2, p3);
}
protected override void RenderLabelRotate(Canvas canvas, RadRect p1, string p2, AxisLabelModel p3)
{
// Draw something only when label fit mode is ROTATE
Paint moccasin = new Paint();
moccasin.Color = Color.ParseColor("#ffe4b5");
canvas.DrawRect(new RectF((float)p1.GetX(), (float)p1.GetY(), (float)p1.Right, (float)p1.Bottom), moccasin);
base.RenderLabelRotate(canvas, p1, p2, p3);
}
public override void RenderLabel(Canvas p0, ChartNode p1)
{
// Always draw something before the given label is drawn.
base.RenderLabel(p0, p1);
}
public override Com.Telerik.Android.Common.Math.RadSize MeasureLabel(AxisLabelModel p0, Java.Lang.Object p1)
{
// Plug some logic when the label is being measured.
return base.MeasureLabel(p0, p1);
}
}
Finally, developers can use this custom label renderer by calling axis.setLabelRenderer(new MyLabelRenderer(axis))
or axis.LabelRenderer = new MyLabelRenderer(axis);
for Xamarin.