Программно создавать анимацию Silverlight с ослаблением в C # - PullRequest
1 голос
/ 22 августа 2010

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

        public void Rotate(double toAngle, RotateTransform rotate)
    {
        Storyboard sb = new Storyboard();

        DoubleAnimationUsingKeyFrames keyframes = new DoubleAnimationUsingKeyFrames();

        EasingDoubleKeyFrame easingStart = new EasingDoubleKeyFrame();
        easingStart.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0));
        easingStart.Value = rotate.Angle;

        EasingDoubleKeyFrame easingEnd = new EasingDoubleKeyFrame();
        easingEnd.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.5));
        easingEnd.Value = toAngle;
        var ease = new ElasticEase();
        ease.EasingMode = EasingMode.EaseIn;
        easingEnd.EasingFunction = ease;

        keyframes.KeyFrames.Add(easingStart);
        keyframes.KeyFrames.Add(easingEnd);

        Storyboard.SetTarget(keyframes, rotate);
        Storyboard.SetTargetProperty(keyframes, new PropertyPath("(RotateTransform.Angle)"));

        sb.Children.Add(keyframes);
        sb.Begin();
    }

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

Когда я запускаю часы, стрелки часов двигаются (секундная стрелка перемещается в нужное место каждую секунду и т. Д.), Но анимация, по-видимому, не оживляет. Они просто мгновенно переходят от начала к концу.

Почему анимация не происходит должным образом?

1 Ответ

1 голос
/ 22 августа 2010

Проблема пропуска, вероятно, заключается в задержке запуска раскадровки, которая хочет показать изменения менее чем за секунду.К тому времени, когда раскадровка готовится к отображению, она в основном говорит: «О ... сейчас уже 1 секунда, где должен Я буду сейчас».Вам лучше с более длинными раскадровками.

Я не уверен, какой контроль вы хотите над своими часами, но в отношении использования одной раскадровки, вот так ...

Я не былуверен в общей проблеме, которую вы пытаетесь решить, но в следующем примере используется одна простая раскадровка для запуска трех стрелок часов.Единственная проблема, с которой я столкнулся, заключалась в том, что максимальный интервал времени, который я мог указать для часовой стрелки (в XAML) без ошибки синтаксического анализа, составляет 23:59:59.

    <Storyboard x:Name="SecondHandStoryboard" RepeatBehavior="Forever">
        <DoubleAnimation Duration="0:1:0" To="360" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)" Storyboard.TargetName="SecondHand" />
        <DoubleAnimation Duration="1:0:0" To="360" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)" Storyboard.TargetName="MinuteHand"/>
        <DoubleAnimation Duration="23:59:59" To="360" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)" Storyboard.TargetName="HourHand"/>
    </Storyboard>

Я на самом деле хотел добавить твердую анимацию «тика» во вторую руку, но не понял, как заставить вращение «на» раскадровки работать.В основном используйте повторяемую раскадровку длительностью 1 секунда со скоростью 6 градусов в секунду с крутым замедлением (продолжит изучать эту проблему).

В любом случае, надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...