Sfoglia il codice sorgente

TransitionKeyFrames transform selection logic are now fully functional.

Trigger RaiseChanged() on TransformGroup class when a child transform was changed.

Split the PlayState enum to a new file.
Jumar Macato 7 anni fa
parent
commit
bb5c5c0d3a

+ 12 - 211
samples/RenderTest/Pages/AnimationsPage.xaml

@@ -5,7 +5,7 @@
       <Styles.Resources>
         <Template x:Key="Acorn">
           <Path Fill="White" Stretch="Uniform" Data="F1 M 16.6309,18.6563C 17.1309,8.15625 29.8809,14.1563 29.8809,14.1563C 30.8809,11.1563 34.1308,11.4063 34.1308,11.4063C 33.5,12 34.6309,13.1563 34.6309,13.1563C 32.1309,13.1562 31.1309,14.9062 31.1309,14.9062C 41.1309,23.9062 32.6309,27.9063 32.6309,27.9062C 24.6309,24.9063 21.1309,22.1562 16.6309,18.6563 Z M 16.6309,19.9063C 21.6309,24.1563 25.1309,26.1562 31.6309,28.6562C 31.6309,28.6562 26.3809,39.1562 18.3809,36.1563C 18.3809,36.1563 18,38 16.3809,36.9063C 15,36 16.3809,34.9063 16.3809,34.9063C 16.3809,34.9063 10.1309,30.9062 16.6309,19.9063 Z"/>
-        </Template>        
+        </Template>
       </Styles.Resources>
       <Style Selector="Border.Test">
         <Setter Property="Margin" Value="15"/>
@@ -20,11 +20,16 @@
       </Style>
       <Style Selector="Border.Rect1:pointerover">
         <Style.Animations>
-          <Animation Duration="0:0:2.5" Easing="QuinticEaseInOut">
+          <Animation Duration="0:0:2.5" Easing="SineEaseInOut">
             <TransformKeyFrames Property="RotateTransform.Angle">
               <KeyFrame Cue="0%" Value="0"/>
               <KeyFrame Cue="100%" Value="360"/>
             </TransformKeyFrames>
+            <TransformKeyFrames Property="ScaleTransform.ScaleX">
+              <KeyFrame Cue="0%" Value="1"/>
+              <KeyFrame Cue="50%" Value="1.5"/>
+              <KeyFrame Cue="100%" Value="1"/>
+            </TransformKeyFrames>
           </Animation>
         </Style.Animations>
       </Style>
@@ -74,113 +79,14 @@
           Hover to activate Transform Keyframe Animations.
         </TextBlock>
         <Button Content="{Binding PlayStateText}" Command="{Binding ToggleGlobalPlayState}"/>
-       </StackPanel>
+      </StackPanel>
       <WrapPanel>
         <Border Classes="Test Rect1" Background="DarkRed">
           <Border.RenderTransform>
-            <RotateTransform/>
-          </Border.RenderTransform>
-         </Border>
-        <Border Classes="Test Rect2" Background="DarkMagenta">
-          <Border.RenderTransform>
-            <ScaleTransform ScaleX="0.8" ScaleY="0.8"/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect3" Background="Navy" >
-          <Border.RenderTransform>
-            <TranslateTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect4" Background="SeaGreen">
-          <Border.RenderTransform>
-            <SkewTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect1" Background="DarkRed">
-          <Border.RenderTransform>
-            <RotateTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect2" Background="DarkMagenta">
-          <Border.RenderTransform>
-            <ScaleTransform ScaleX="0.8" ScaleY="0.8"/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect3" Background="Navy" >
-          <Border.RenderTransform>
-            <TranslateTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect4" Background="SeaGreen">
-          <Border.RenderTransform>
-            <SkewTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect1" Background="DarkRed">
-          <Border.RenderTransform>
-            <RotateTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect2" Background="DarkMagenta">
-          <Border.RenderTransform>
-            <ScaleTransform ScaleX="0.8" ScaleY="0.8"/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect3" Background="Navy" >
-          <Border.RenderTransform>
-            <TranslateTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect4" Background="SeaGreen">
-          <Border.RenderTransform>
-            <SkewTransform/>
-          </Border.RenderTransform>
-        </Border>
-
-        <Border Classes="Test Rect1" Background="DarkRed">
-          <Border.RenderTransform>
-            <RotateTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect2" Background="DarkMagenta">
-          <Border.RenderTransform>
-            <ScaleTransform ScaleX="0.8" ScaleY="0.8"/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect3" Background="Navy" >
-          <Border.RenderTransform>
-            <TranslateTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect4" Background="SeaGreen">
-          <Border.RenderTransform>
-            <SkewTransform/>
-          </Border.RenderTransform>
-        </Border>
-
-        <Border Classes="Test Rect1" Background="DarkRed">
-          <Border.RenderTransform>
-            <RotateTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect2" Background="DarkMagenta">
-          <Border.RenderTransform>
-            <ScaleTransform ScaleX="0.8" ScaleY="0.8"/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect3" Background="Navy" >
-          <Border.RenderTransform>
-            <TranslateTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect4" Background="SeaGreen">
-          <Border.RenderTransform>
-            <SkewTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect1" Background="DarkRed">
-          <Border.RenderTransform>
-            <RotateTransform/>
+            <TransformGroup>
+              <RotateTransform/>
+              <ScaleTransform/>
+            </TransformGroup>
           </Border.RenderTransform>
         </Border>
         <Border Classes="Test Rect2" Background="DarkMagenta">
@@ -199,111 +105,6 @@
           </Border.RenderTransform>
         </Border>
 
-        <Border Classes="Test Rect1" Background="DarkRed">
-          <Border.RenderTransform>
-            <RotateTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect2" Background="DarkMagenta">
-          <Border.RenderTransform>
-            <ScaleTransform ScaleX="0.8" ScaleY="0.8"/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect3" Background="Navy" >
-          <Border.RenderTransform>
-            <TranslateTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect4" Background="SeaGreen">
-          <Border.RenderTransform>
-            <SkewTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect1" Background="DarkRed">
-          <Border.RenderTransform>
-            <RotateTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect2" Background="DarkMagenta">
-          <Border.RenderTransform>
-            <ScaleTransform ScaleX="0.8" ScaleY="0.8"/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect3" Background="Navy" >
-          <Border.RenderTransform>
-            <TranslateTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect4" Background="SeaGreen">
-          <Border.RenderTransform>
-            <SkewTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect1" Background="DarkRed">
-          <Border.RenderTransform>
-            <RotateTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect2" Background="DarkMagenta">
-          <Border.RenderTransform>
-            <ScaleTransform ScaleX="0.8" ScaleY="0.8"/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect3" Background="Navy" >
-          <Border.RenderTransform>
-            <TranslateTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect4" Background="SeaGreen">
-          <Border.RenderTransform>
-            <SkewTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect1" Background="DarkRed">
-          <Border.RenderTransform>
-            <RotateTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect2" Background="DarkMagenta">
-          <Border.RenderTransform>
-            <ScaleTransform ScaleX="0.8" ScaleY="0.8"/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect3" Background="Navy" >
-          <Border.RenderTransform>
-            <TranslateTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect4" Background="SeaGreen">
-          <Border.RenderTransform>
-            <SkewTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect1" Background="DarkRed">
-          <Border.RenderTransform>
-            <RotateTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect2" Background="DarkMagenta">
-          <Border.RenderTransform>
-            <ScaleTransform ScaleX="0.8" ScaleY="0.8"/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect3" Background="Navy" >
-          <Border.RenderTransform>
-            <TranslateTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect4" Background="SeaGreen">
-          <Border.RenderTransform>
-            <SkewTransform/>
-          </Border.RenderTransform>
-        </Border>
-        <Border Classes="Test Rect1" Background="DarkRed">
-          <Border.RenderTransform>
-            <RotateTransform/>
-          </Border.RenderTransform>
-        </Border>
       </WrapPanel>
     </StackPanel>
   </Grid>

+ 0 - 17
src/Avalonia.Animation/Animatable.cs

@@ -11,22 +11,6 @@ using System.Collections.Generic;
 
 namespace Avalonia.Animation
 {
-    /// <summary>
-    /// 
-    /// </summary>
-    public enum AnimationPlayState
-    {
-        /// <summary>
-        /// 
-        /// </summary>
-        Running,
-
-        /// <summary>
-        /// 
-        /// </summary>
-        Paused
-    }
-
     /// <summary>
     /// Base class for control which can have property transitions.
     /// </summary>
@@ -76,7 +60,6 @@ namespace Avalonia.Animation
             set { SetAndRaise(TransitionsProperty, ref _transitions, value); }
         }
 
-
         /// <summary>
         /// Reacts to a change in a <see cref="AvaloniaProperty"/> value in 
         /// order to animate the change if a <see cref="ITransition"/> is set for the property.

+ 0 - 12
src/Avalonia.Animation/Animation.cs

@@ -56,17 +56,5 @@ namespace Avalonia.Animation
             return this;
         }
 
-        ///// <summary>
-        ///// Notifies the provider that an observer is to receive notifications.
-        ///// </summary>
-        ///// <param name="observer">The observer.</param>
-        ///// <returns>
-        ///// A reference to an interface that allows observers to stop receiving notifications
-        ///// before the provider has finished sending them.
-        ///// </returns>
-        //public IDisposable Subscribe(IObserver<object> observer)
-        //{
-        //    return _inner.Subscribe(observer);
-        //}
     }
 }

+ 12 - 0
src/Avalonia.Animation/AnimationPlayState.cs

@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Avalonia.Animation
+{
+    public enum AnimationPlayState
+    {
+        Running,
+        Paused
+    }
+}

+ 14 - 15
src/Avalonia.Visuals/Animation/Keyframes/TransformKeyFrames.cs

@@ -32,30 +32,29 @@ namespace Avalonia.Animation.Keyframes
                     InitializeInternalDoubleKeyFrames();
                 }
 
-                // It's only 1 transform object so let's target that.
-                if (renderTransformType == Property.OwnerType)
+                if(ctrl.RenderTransform != null)
                 {
-                    return childKeyFrames.Apply(animation, ctrl.RenderTransform, obsMatch);
-                }
-                // TODO: Selection within TransformGroup is not working
-                if (renderTransformType == typeof(TransformGroup))
-                {
-                    foreach (Transform transform in ((TransformGroup)ctrl.RenderTransform).Children)
+                    // It's only 1 transform object so let's target that.
+                    if (renderTransformType == Property.OwnerType)
+                    {
+                        return childKeyFrames.Apply(animation, ctrl.RenderTransform, obsMatch);
+                    }
+                    else if (renderTransformType == typeof(TransformGroup))
                     {
-                        if (transform.GetType() == Property.OwnerType)
+                        foreach (Transform transform in ((TransformGroup)ctrl.RenderTransform).Children)
                         {
-                             return childKeyFrames.Apply(animation, transform, obsMatch);
+                            if (transform.GetType() == Property.OwnerType)
+                            {
+                                return childKeyFrames.Apply(animation, transform, obsMatch);
+                            }
                         }
                     }
+
+                    //throw new InvalidOperationException($"TransformKeyFrame hasn't found an appropriate Transform object with type {Property.OwnerType} in target {control}.");
                 }
 
                 return null;
 
-                // // Throw exception when there is no appropriate transform object found.
-                // throw new Exception
-                //     ($"TransformKeyFrame hasn't found an appropriate Transform object with type {Property.OwnerType} in target {control}.");
-
-
             }
             else
             {

+ 24 - 0
src/Avalonia.Visuals/Media/TransformGroup.cs

@@ -3,6 +3,7 @@
 
 using Avalonia.Collections;
 using Avalonia.Metadata;
+using System.Collections.Specialized;
 
 namespace Avalonia.Media
 {
@@ -17,6 +18,29 @@ namespace Avalonia.Media
         public TransformGroup()
         {
             Children = new Transforms();
+            Children.CollectionChanged += (_, e) =>
+            {
+                switch (e.Action)
+                {
+                    case NotifyCollectionChangedAction.Add:
+                        foreach (Transform tr in e.NewItems)
+                        {
+                            tr.Changed += ChildTransform_Changed;
+                        }
+                        break;
+                    case NotifyCollectionChangedAction.Remove:
+                        foreach (Transform tr in e.OldItems)
+                        {
+                            tr.Changed -= ChildTransform_Changed;
+                        }
+                        break;
+                }
+            };
+        }
+
+        private void ChildTransform_Changed(object sender, System.EventArgs e)
+        {
+            this.RaiseChanged();
         }
 
         /// <summary>