Анимировать пользовательское свойство с помощью CoreAnimation в Monotouch? - PullRequest
3 голосов
/ 03 марта 2012

По сути, это тот же вопрос, что и здесь: Анимация пользовательского свойства в CALayer более года назад и не получил ответа.

Я создаю собственный слой и рисую на нем круг. Я хотел бы иметь возможность анимировать радиус круга (и другие свойства позже). Из того, что я прочитал, я настроил это так:

public class CircleLayer : CALayer
{

    //[Export("radius")]
     //public float Radius { get;set; }
    //EDIT: I've now changed the radius field to what is coded below


        public float Radius;

    [Export("radius")]
    public float getRadius()
    {
        return Radius;
    }

    [Export("setRadius:")]
    public void setRadius(float val)
    {
        Radius = val;
    }

    public float Thickness {get;set;}
    public CGColor Color {get;set;}
    public float GlowAmount {get;set;}

    private SizeF GlowOffset {get;set;}

    [Export ("needsDisplayForKey:")]
    static bool NeedsDisplayForKey (NSString key)
    {
        Console.WriteLine(key.ToString());

        if(key.Equals("radius"))
        {

            return true; 
        }
        else
            return false;

    }



    public CircleLayer ()
    {
        if(GlowAmount == 0.0f)
            GlowAmount = 10f;

        GlowOffset = new SizeF(0f,0f);
        //CALayer.NeedsDisplayForKey("radius");
    }



    public override void DrawInContext (CGContext context)
    {
        base.DrawInContext (context);
        Console.WriteLine("drawing...........");
        PointF centerPoint = new PointF(125,125);//this.Frame.Width/2,this.Frame.Height/2);


        //Outer circle
        context.AddEllipseInRect(new RectangleF(centerPoint.X - Radius,
                                                centerPoint.Y - Radius,
                                                Radius * 2,
                                                Radius * 2));
        //Inner circle
        context.AddEllipseInRect(new RectangleF(centerPoint.X - InnerRadius,
                                                centerPoint.Y - InnerRadius,
                                                InnerRadius * 2,
                                                InnerRadius * 2));

        //Fill in circle
        context.SetFillColor(Color);
        context.SetShadowWithColor(GlowOffset,GlowAmount,GlowColor);
        context.EOFillPath();


    }
}

Но это просто не работает. Я никогда не получаю сообщение о ключе радиуса при вызове NeedsDisplayForKey (и выводит их на консоль). Я не могу анимировать стандартные свойства без проблем (например: масштаб)

Редактировать: обратите внимание, что теперь я могу успешно изменить значение свойства Radius с помощью SetValueForKey. Если я делаю это, мне нужно вызвать SetNeedsDisplay () для обновления экрана, однако я все равно не могу заставить анимацию работать вообще.

Редактировать # 2: Образец прилагается: http://dl.dropbox.com/u/8617393/GraphicsTest1.zip

1 Ответ

2 голосов
/ 27 апреля 2012

Это, к сожалению, невозможно сделать с MonoTouch - но мы исправили это для следующей бета-версии (5.3.3), которая, как мы надеемся, скоро выйдет.

После выпуска 5.3.3 вы можете использовать этот пример: https://github.com/xamarin/monotouch-samples/tree/monotouch-5.4/CustomPropertyAnimation, чтобы узнать, как это сделать.

...