powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Анимация Geometry
3 сообщений из 3, страница 1 из 1
Анимация Geometry
    #39381353
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно вопрос о том, кто и как анимирует геометрию.
Для примера возьмём любую составную геометрию (это те геометрии в которых несколько непрерывных кривых)

Если я хочу анимировать не цвет или размер иконки, а её содержимое. То есть поменять в Geometry некоторые её составные части.
К примеру, скрыть какую то составную часть

a) мы можем с помощью DiscreteObjectKeyFrame изменить геометрию целиком, сохраняя у себя все кадры геометрии. На мой взгляд это самый простой вариант, в котором можно ограничиться чисто XAML ресурсами, без лишнего кода.
Простой пример:
Код: 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.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Page.Triggers>
        <EventTrigger RoutedEvent="Control.Loaded">
            <EventTrigger.Actions>
                <BeginStoryboard>
                    <Storyboard RepeatBehavior="Forever" Duration="0:0:6">
                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_Path" Storyboard.TargetProperty="Data">
                            <DiscreteObjectKeyFrame KeyTime="0:0:0" >
                                <DiscreteObjectKeyFrame.Value>
                                    <PathGeometry Figures="M17,11 H15 V9 H17 M13,11 H11 V9 H13 M9,11 H7 V9 H9 M20,2H4A2,2 0 0,0 2,4V22L6,18H20A2,2 0 0,0 22,16V4C22,2.89 21.1,2 20,2Z"/>
                                </DiscreteObjectKeyFrame.Value>
                            </DiscreteObjectKeyFrame>
                            <DiscreteObjectKeyFrame KeyTime="0:0:1">
                                <DiscreteObjectKeyFrame.Value>
                                    <PathGeometry Figures="M17,11 H15 V9 H17 M13,11 H11 V9 H13 M20,2H4A2,2 0 0,0 2,4V22L6,18H20A2,2 0 0,0 22,16V4C22,2.89 21.1,2 20,2Z"/>
                                </DiscreteObjectKeyFrame.Value>
                            </DiscreteObjectKeyFrame>
                            <DiscreteObjectKeyFrame KeyTime="0:0:2">
                                <DiscreteObjectKeyFrame.Value>
                                    <PathGeometry Figures="M17,11 H15 V9 H17 M20,2H4A2,2 0 0,0 2,4V22L6,18H20A2,2 0 0,0 22,16V4C22,2.89 21.1,2 20,2Z"/>
                                </DiscreteObjectKeyFrame.Value>
                            </DiscreteObjectKeyFrame> 
                            <DiscreteObjectKeyFrame KeyTime="0:0:3">
                                <DiscreteObjectKeyFrame.Value>
                                    <PathGeometry Figures="M20,2H4A2,2 0 0,0 2,4V22L6,18H20A2,2 0 0,0 22,16V4C22,2.89 21.1,2 20,2Z"/>
                                </DiscreteObjectKeyFrame.Value>
                            </DiscreteObjectKeyFrame>

                            <DiscreteObjectKeyFrame KeyTime="0:0:4" >
                                <DiscreteObjectKeyFrame.Value>
                                    <PathGeometry Figures="M9,11 H7 V9 H9 M20,2H4A2,2 0 0,0 2,4V22L6,18H20A2,2 0 0,0 22,16V4C22,2.89 21.1,2 20,2Z"/>
                                </DiscreteObjectKeyFrame.Value>
                            </DiscreteObjectKeyFrame>

                            <DiscreteObjectKeyFrame KeyTime="0:0:5" >
                                <DiscreteObjectKeyFrame.Value>
                                    <PathGeometry Figures="M13,11 H11 V9 H13 M9,11 H7 V9 H9 M20,2H4A2,2 0 0,0 2,4V22L6,18H20A2,2 0 0,0 22,16V4C22,2.89 21.1,2 20,2Z"/>
                                </DiscreteObjectKeyFrame.Value>
                            </DiscreteObjectKeyFrame>

                        </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger.Actions>
        </EventTrigger>
    </Page.Triggers>
    <Grid>
        <Path x:Name="PART_Path"
              Data="M17,11H15V9H17M13,11H11V9H13M9,11H7V9H9M20,2H4A2,2 0 0,0 2,4V22L6,18H20A2,2 0 0,0 22,16V4C22,2.89 21.1,2 20,2Z"
              Fill="DarkGray" HorizontalAlignment="Center" VerticalAlignment="Center" SnapsToDevicePixels="True"/>
    </Grid>
</Page>


б) класс Geometry является Freezable классом, а значит может быть анимирован непосредственно сам Geometry.
Но тут есть некоторые подводные камни. StreamGeometry который получается в результате парсинга PathString'а "по умолчанию" всегда IsFrozen.
Код: xml
1.
<Path x:Name="PART_Path" Fill="DarkGray" HorizontalAlignment="Center" VerticalAlignment="Center" SnapsToDevicePixels="True" Data="M17,11H15V9H17M13,11H11V9H13M9,11H7V9H9M20,2H4A2,2 0 0,0 2,4V22L6,18H20A2,2 0 0,0 22,16V4C22,2.89 21.1,2 20,2Z"/>


Чтоб не получать StreamGeometry, просто объявим его как PathGeometry
Код: xml
1.
2.
3.
4.
5.
        <Path x:Name="PART_Path" Fill="DarkGray" HorizontalAlignment="Center" VerticalAlignment="Center" SnapsToDevicePixels="True">
            <Path.Data>
                <PathGeometry Figures="M17,11H15V9H17M13,11H11V9H13M9,11H7V9H9M20,2H4A2,2 0 0,0 2,4V22L6,18H20A2,2 0 0,0 22,16V4C22,2.89 21.1,2 20,2Z"/>
            </Path.Data>
        </Path>


При этом я могу анимировать некоторые свойства, например StartPoint, но анимировать точки сегментов у меня не получается :(
работает:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    <Window.Triggers>
        <EventTrigger RoutedEvent="Control.Loaded">
            <EventTrigger.Actions>
                <BeginStoryboard>
                    <Storyboard>
                        <PointAnimation Storyboard.TargetName="PART_Path"
                                        Storyboard.TargetProperty="Data.(PathGeometry.Figures)[2].StartPoint"
                                        From="0,0" To="10,10" Duration="0:0:2"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger.Actions>
        </EventTrigger>
    </Window.Triggers>


не работает:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        <EventTrigger RoutedEvent="Control.Loaded">
            <EventTrigger.Actions>
                <BeginStoryboard>
                    <Storyboard>
                        <PointAnimation Storyboard.TargetName="PART_Path"
                                        Storyboard.TargetProperty="Data.(PathGeometry.Figures)[2].(PathFigure.Points)[0]"
                                        From="0,0" To="10,10" Duration="0:0:2"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger.Actions>
        </EventTrigger>


в) вариант с Shape, можно создать свой Shape объект, развалить геометрию на составные части и управлять ими индивидуально
Код: 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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
        private static Geometry GetGeometry()
        {
            var figure3 = new PathFigure()
            {
                StartPoint = new Point(17.0, 11.0),
                Segments =
                    {
                        new PolyLineSegment()
                        {
                            Points =
                            {
                                new Point(15.0,11.0),
                                new Point(15.0,9.0),
                                new Point(17.0,9.0)
                            }
                        }
                    },
                IsClosed = true
            };
            var figure2 = new PathFigure()
            {
                StartPoint = new Point(13.0, 11.0),
                Segments =
                    {
                        new PolyLineSegment()
                        {
                            Points =
                            {
                                new Point(11.0,11.0),
                                new Point(11.0,9.0),
                                new Point(13.0,9.0)
                            }
                        }
                    },
                IsClosed = true
            };
            var figure1 = new PathFigure()
            {
                StartPoint = new Point(9.0, 11.0),
                Segments =
                    {
                        new PolyLineSegment()
                        {
                            Points =
                            {
                                new Point(7.0,11.0),
                                new Point(7.0,9.0),
                                new Point(9.0,9.0)
                            }
                        }
                    },
                IsClosed = true
            };
            var body = new PathFigure()
            {
                StartPoint = new Point(20.0, 2.0),
                Segments =
                    {
                        new LineSegment() { Point = new Point(4.0, 2.0) },
                        new ArcSegment() { Point = new Point(2.0, 4.0), Size = new Size(2.0, 2.0) },
                        new PolyLineSegment() { Points = { new Point(2.0, 22.0), new Point(6.0, 18.0), new Point(20.0, 18.0) } },
                        new ArcSegment() { Point = new Point(22.0, 16.0), Size = new Size(2.0, 2.0) },
                        new LineSegment() { Point = new Point(22.0, 4.0) },
                        new BezierSegment() { Point1 = new Point(22.0, 2.89), Point2 = new Point(22.1, 2.0), Point3 = new Point(20.0, 2.0) }
                    }
            };
            return new PathGeometry() { Figures = { figure3, figure2, figure1, body } };

        }


но как не странно, анимировать Segment У меня так и не получилось, вылетает Exception о том, что объект immutable, хотя он не заморожен или что то подобное.
у кого какие идеи есть на этот счёт?
...
Рейтинг: 0 / 0
Анимация Geometry
    #39382664
Rocketeer88888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesно как не странно, анимировать Segment У меня так и не получилось, вылетает Exception о том, что объект immutable, хотя он не заморожен или что то подобное.
Полный текст исключения желательно иметь. А так вот
https://blogs.msdn.microsoft.com/mikehillberg/2006/09/25/tip-cannot-animate-on-an-immutable-object-instance/

А ещё попробуй анимировать отдельные точки этих сегментов. Причём не PointAnimation, а сами координаты этих точек.
...
Рейтинг: 0 / 0
Анимация Geometry
    #39382666
Rocketeer88888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если геометрия несложная, состоит из одних прямых, можешь попробовать 3Д сцену заанимировать с 3Д линиями. Все линии в одну плоскость поставь, и камеру поставь перпендикулярно этой плоскости. По крайней мере я источники света "катал" по сцене, просто анимируя их координаты (не помню точно, через таймер в коде, или в разметке задавал параметры анимации).
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Анимация Geometry
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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