powered by simpleCommunicator - 2.0.27     © 2024 Programmizd 02
Map
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Animation TimeLine
5 сообщений из 5, страница 1 из 1
Animation TimeLine
    #39959750
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, есть вопрос, который мне не понятен.
возьмём сферический пример в вакууме:
есть элемент управления, к этому элементу управления применяется анимация DoubleAnimation,
заданы свойства To = 1, Duration = 2 сек и другие. Стартовое базовое значение свойства = 0;

Если мы применим эту анимацию к объекту, то заданное свойство будет изменяться от 0 до 1 оно будет выполняться 2 секунды, следовательно скорость изменения будет равна 1/2 в секунду. В момент, когда анимация достигла 50% выполнения (то есть значение равно = .5) мы запускаем её еще раз и теперь свойство изменяется от 0.5 до 1 за 2 сек, то есть скорость изменения будет уже не 1/2 секунды, а 1/4. Это будет заметно невооруженным глазом. Очевидно, что для повторного запуска нам нужно рассчитать новую скорость и даже если она будет с небольшой погрешностью, это не особо и страшно, но все эти свойства не вычисляемые.
И как мне кажется, если объект загружен из XAML, то менять его свойства где то в Runtime, такая себе идея.
при этом для расчета времени, от точки C (значение прерванной анимации) до точки B (конечное значение, To), нам нужно знать и точку A (начальное значение, From).

В Timeline'е есть еще свойство SpeedRatio, по идее, оно должно решать эту проблему, но если в нашем Storyboard есть несколько анимаций с BeginTime, то их нужно сдвинуть на время, которое стало меньше из-за увеличения SpeedRatio.

То есть, сделать по человечески анимацию в чистом XAML с учётом всех этих моментов это какой то геморой, колхоз и говно код.
Кто то решал эти задачи?
...
Рейтинг: 0 / 0
Animation TimeLine
    #39960426
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes , в своё время самому такое нужно было, но ничего не нашёл.
Пришлось делать с использованием C#.
Для себя сделал разовое решение через производный класс от DoubleAnimation.
Но можно и через AP-свойство.
Других вариантов - не вижу.
...
Рейтинг: 0 / 0
Animation TimeLine
    #39960481
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld Hasp,

я тоже попробовал сделать через анимацию, наследовал от AnimationTimeLine, а не от DoubleAnimation,
добавил 2 свойства To и Speed, все работает, но есть одна загвоздка, время выполнения анимации (Duration) определено на базовом классе, следовательно анимация либо будет выполняться фиксированное время, либо непрерывно. 1 случай не подходит, так как время в данном случае значение переменное, а не константное. А во втором случае возникает проблема в том, как эту анимацию остановить. То есть она будет действовать вечно (Forever) и вызывать GetCurrentValue() постоянно, пока анимацию не заместишь другой или null.
Есть еще вариант подшаманить с параметром SpeedRatio, он может либо ускорять анимацию, либо замедлять её в N раз. Но такой подход мне кажется абсолютно колхозным. Кроме того, он предполагает, что необходимо знать не только конечное значение, но и начальное, чтоб можно было рассчитать время выполнения и найти коэффициент ускорения.

Спасибо, что уделил мне время :)
...
Рейтинг: 0 / 0
Animation TimeLine
    #39960511
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes , сейчас поздно - искать код не буду.
Завтра, если понадобится поищу.
Но там всё просто было.
Доп. DP-свойство double? Speed - величина изменения в секунду.
При задании Speed, From или To был вызов метода.
В методе проверялось установка всех трёх свойств.
Если установлены, то задавалось время анимации.

Вот не помню сейчас как делал при не заданном From.
Завтра посмотрю - вспомню.
...
Рейтинг: 0 / 0
Animation TimeLine
    #39960598
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes , не знаю насколько поможет вам.
Вот моя реализация - использовал для простой демонстрационной аркады.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
	public class DoubleSpeedAnimation : DoubleAnimation
	{

		public double? Speed
		{
			get { return (double?)GetValue(SpeedProperty); }
			set { SetValue(SpeedProperty, value); }
		}

		// Using a DependencyProperty as the backing store for Speed.  This enables animation, styling, binding, etc...
		public static readonly DependencyProperty SpeedProperty =
			DependencyProperty.Register("Speed", typeof(double?), typeof(DoubleSpeedAnimation),
				new PropertyMetadata(null));

		protected override void OnChanged()
		{
			base.OnChanged();

			if (From == null)
			{
				string target = Storyboard.GetTargetName(this);
				PropertyPath property = Storyboard.GetTargetProperty(this);
				if (target != null && property != null)
					BindingOperations.SetBinding(this, FromProperty, new Binding() { ElementName = target, Path = property });
			}

			if (From != null && To != null && Speed != null && Speed != 0.0)
				Duration = TimeSpan.FromSeconds(Math.Abs((To.Value - From.Value) / Speed.Value));

		}

	}



Пример использования.
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
    <Grid Width="800" Height="600">
        <Grid.Triggers>
            <EventTrigger RoutedEvent="Button.Click" SourceName="clear">
                <StopStoryboard BeginStoryboardName="doubleAn"/>
                <StopStoryboard BeginStoryboardName="speedAn"/>
            </EventTrigger>
            <EventTrigger RoutedEvent="Button.Click" SourceName="double">
                <BeginStoryboard x:Name="doubleAn">
                    <Storyboard>
                        <DoubleAnimation
                            To="700"
                            Duration="0:0:10"
                            Storyboard.TargetName="border"
                            Storyboard.TargetProperty="Width"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
            <EventTrigger RoutedEvent="Button.Click" SourceName="speed">
                <BeginStoryboard x:Name="speedAn">
                    <Storyboard>
                        <local:DoubleSpeedAnimation
                            To="700"
                            Speed="70"
                            Storyboard.TargetName="border"
                            Storyboard.TargetProperty="Width"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>

        </Grid.Triggers>
        <Border x:Name="border" Background="Green" Width="50" Height="50" VerticalAlignment="Top" HorizontalAlignment="Left"/>
        <Button x:Name="double" Content="DoubleAnimation" VerticalAlignment="Bottom" HorizontalAlignment="Left"
                Margin="10" Padding="20,5"/>
        <Button x:Name="speed" Content="SpeedConstAnimation" VerticalAlignment="Bottom" HorizontalAlignment="Center"
                Margin="10" Padding="20,5"/>
        <Button x:Name="clear" Content="Go to Begin" VerticalAlignment="Bottom" HorizontalAlignment="Right"
                Margin="10" Padding="20,5"/>
    </Grid>
</Window>
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Animation TimeLine
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]