Cell Decorator for a specif cell

5 posts, 0 answers
  1. Fabio
    Fabio avatar
    20 posts
    Member since:
    Apr 2015

    Posted 14 May 2015 Link to this post

    Hello

     I am trying to decorate a specif cell, I have only achieve this to aply this decorator when the cell is tabbed/clicked, but How I apply a decorator to specif cells only.

     I am using this decorator:

    CellDecorator decorator = new CircularCellDecorator(calendarView);
    decorator.Color = (Android.Graphics.Color.ParseColor("#ed742c"));
    decorator.StrokeWidth = 3;
    decorator.Scale = .75f;
     
    calendarView.CellDecorator = decorator;

    Also can I fill the circle with the color?

    I can see that there is a function called:

    calendarView.CellDecorator.ToggleDecorationForCell();

    But I need to pass a CalendarCell which is an Abstract class. 

  2. Fabio
    Fabio avatar
    20 posts
    Member since:
    Apr 2015

    Posted 14 May 2015 Link to this post

    I may have found a way but nothing is being rendered, here is my code:

    CustomCalendarCell test = new CustomCalendarCell(calendarView);
    test.Date = DateTime.Now.Ticks;
     
    calendarView.CellDecorator.ToggleDecorationForCell(test);
     
    public class CustomCalendarCell : CalendarCell
    {
         public CustomCalendarCell(RadCalendarView p0) : base(p0) { }
    }

    Any Ideas?

  3. DevCraft banner
  4. Antony Jekov
    Admin
    Antony Jekov avatar
    88 posts

    Posted 20 May 2015 Link to this post

    Hello Fabio,

    Thank you for contacting the Android team.

    You are going in the right direction. The cell decorators only trigger when the cell is selected. The other option for customization without extensions is the custom rules, but they still cannot provide the effect you are looking for.

    In your case you would like to extend the CalendarDayCell and add logic to its render method. I have prepared a simple implementation by following your request:
    [Activity (Label = "App", MainLauncher = true, Icon = "@drawable/icon")]
        public class MainActivity : Activity
        {
            protected override void OnCreate (Bundle bundle)
            {
                base.OnCreate (bundle);
     
                RadCalendarView calendarView = new RadCalendarView (this);
                calendarView.Adapter = new CustomAdapter (calendarView);
                calendarView.Adapter.Style = CalendarStyles.MaterialLight (this);
                calendarView.Adapter.DateTextPosition = CalendarElement.Center;
     
                SetContentView (calendarView);
            }
     
            internal class CustomAdapter : CalendarAdapter {
                 
                public CustomAdapter(RadCalendarView owner) : base(owner){}
     
                protected override CalendarDayCell GenerateCalendarDayCell ()
                {
                    return new DayCell (Owner);
                }
     
                internal class DayCell : CalendarDayCell {
     
                    private readonly Paint paint;
                    private int radius;
     
                    private int halfHeight;
                    private int halfWidth;
     
                    public DayCell(RadCalendarView owner) : base(owner){
                        this.paint = new Paint(PaintFlags.AntiAlias);
                        this.paint.Color = Color.LightSteelBlue;
                    }
     
                    public override void Arrange (int p0, int p1, int p2, int p3)
                    {
                        base.Arrange (p0, p1, p2, p3);
     
                        radius = (int)(System.Math.Min(Width, Height) * .8f) / 2;
                        halfWidth = Width / 2;
                        halfHeight = Height / 2;
                        paint.StrokeWidth = System.Math.Min (Width, Height) * .05f;
                    }
     
                    public override void Render (Canvas canvas)
                    {
                        base.Render (canvas);
     
                        if (this.CellType == CalendarCellType.Date) {
                            canvas.DrawCircle (Left + halfWidth, Top + halfHeight, radius, paint);
                            canvas.DrawText (Text, TextPositionX(), TextPositionY(), TextPaint);
                        }
                    }
                }
            }
        }

    This will produce the result you are looking for.

    1. Check if the cell is a date cell (not a day name cell).
    2. Render the circle.
    3. Render the text above the circle using the text coordinates and the text paint.

    Please let me know if this suits you purposes.

    Thank you for your time and all best!

    Regards,
    Antony Jekov
    Telerik
    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Feedback Portal and vote to affect the priority of the items
  5. Fabio
    Fabio avatar
    20 posts
    Member since:
    Apr 2015

    Posted 21 May 2015 in reply to Antony Jekov Link to this post

    Hello Thanks so much for the response. Is there a way to change the color and the size of the text?

    I have tried this:

    public DayCell(RadCalendarView owner) : base(owner){
    rnd = new System.Random();
    paint = new Paint(PaintFlags.AntiAlias);
    switch (GetRandomBoolean())
    {
     case 0:
    paint.Color = Android.Graphics.Color.White;
    paint.TextSize = 16;
    //TextSize = 16;
    break;
     
    case 1:
    paint.Color = Android.Graphics.Color.Rgb(235,124,93);
    paint.TextSize = 16;
    //TextColor = Android.Graphics.Color.White;
    //TextSize = 16;
    break;
     
    case 2:
    paint.Color = Android.Graphics.Color.Rgb(64,158,186);
    paint.TextSize = 16;
    //TextColor = Android.Graphics.Color.White;
    //TextSize = 16;
    break;
    }
    }

  6. Antony Jekov
    Admin
    Antony Jekov avatar
    88 posts

    Posted 25 May 2015 Link to this post

    Hi Fabio,

    You can use a customization rule for changing the existing properties of the cell. You will find it very difficult to try and use another way. Here is the sample code:
        class Customization : Java.Lang.Object, IProcedure {
        int[] colors = {Color.Red, Color.Green, Color.Blue, Color.DarkRed, Color.AntiqueWhite};
        System.Random random = new System.Random ();
     
        public void Apply (Java.Lang.Object cell)
        {
            try {
                CalendarDayCell dayCell = cell.JavaCast<CalendarDayCell> ();
                int color = colors[random.Next(colors.Length)];
                dayCell.SetTextColor(color, color);
            } catch (System.Exception ex) {
                 
            }
        }
    }
     And setting this to the calendar would look like this:
    calendarView.CustomizationRule = new Customization ();
     I hope this is what you are looking for.

    Regards,
    Antony Jekov
    Telerik
    Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Feedback Portal and vote to affect the priority of the items
Back to Top
DevCraft banner