internal async static Task AnimatePageOutReverse(Frame frame) { if (frame.Content is FrameworkElement page) { if (_compositor == null) { _compositor = ElementCompositionPreview.GetElementVisual(page).Compositor; } var visual = ElementCompositionPreview.GetElementVisual(page); string offsetToUse = $"{frame.ActualWidth}"; KeyFrameAnimation offsetInAnimation = _compositor.CreateScalarKeyFrameAnimation(); offsetInAnimation.InsertExpressionKeyFrame(1f, offsetToUse); offsetInAnimation.Duration = TimeSpan.FromMilliseconds(250); KeyFrameAnimation fadeAnimation = _compositor.CreateScalarKeyFrameAnimation(); fadeAnimation.InsertExpressionKeyFrame(1f, "0"); fadeAnimation.Duration = TimeSpan.FromMilliseconds(250); visual.StartAnimation("Offset.X", offsetInAnimation); visual.StartAnimation("Opacity", fadeAnimation); await Task.Delay(fadeAnimation.Duration); } }
private void ItemConainer_Loaded(object sender, RoutedEventArgs e) { var itemPanel = albumView.ItemsPanelRoot as ItemsWrapGrid; var itemContainer = sender as GridViewItem; var itemIndex = albumView.IndexFromContainer(itemContainer); if (itemIndex >= itemPanel.FirstVisibleIndex && itemIndex <= itemPanel.LastVisibleIndex) { //Loading animation var itemVisual = ElementCompositionPreview.GetElementVisual(itemContainer); float width = 200; float height = 200; itemVisual.Size = new Vector2(width, height); itemVisual.CenterPoint = new Vector3(width / 2, height / 2, 0f); itemVisual.Opacity = 0.0f; Vector3KeyFrameAnimation scalAnimation = _compositor.CreateVector3KeyFrameAnimation(); scalAnimation.InsertKeyFrame(0f, new Vector3(0.9f, 0.9f, .9f)); scalAnimation.InsertKeyFrame(1f, new Vector3(1f, 1f, 0f)); scalAnimation.Duration = TimeSpan.FromMilliseconds(600); var x = itemIndex - itemPanel.FirstVisibleIndex; scalAnimation.DelayTime = TimeSpan.FromMilliseconds((itemIndex - itemPanel.FirstVisibleIndex) * 20); KeyFrameAnimation fadeAnimation = _compositor.CreateScalarKeyFrameAnimation(); fadeAnimation.InsertExpressionKeyFrame(1f, "1"); fadeAnimation.Duration = TimeSpan.FromMilliseconds(600); fadeAnimation.DelayTime = TimeSpan.FromMilliseconds((itemIndex - itemPanel.FirstVisibleIndex) * 20); itemVisual.StartAnimation("Scale", scalAnimation); itemVisual.StartAnimation("Opacity", fadeAnimation); } itemContainer.Loaded -= ItemConainer_Loaded; }
internal async static Task ColorTransitionOut(Frame frame) { if (frame.Content is Page page) { if (page.Background != null) { frame.Background = page.Background; } else if (page.Content is Panel panel) { if (panel.Background != null) { frame.Background = panel.Background; } else { frame.Background = (SolidColorBrush)Application.Current.Resources[systemBackgroundColourKey]; } } var visual = ElementCompositionPreview.GetElementVisual(page); KeyFrameAnimation opacityAnimation = _compositor.CreateScalarKeyFrameAnimation(); opacityAnimation.InsertExpressionKeyFrame(1f, "0"); opacityAnimation.Duration = TimeSpan.FromMilliseconds(1000); var sv = _compositor.CreateSpriteVisual(); sv.Brush = _compositor.CreateColorBrush(Colors.LimeGreen); visual.StartAnimation("Opacity", opacityAnimation); await Task.Delay(333); } }
internal async static Task AnimatePageIn(Frame frame) { if (frame.Content is FrameworkElement page) { if (_compositor == null) { _compositor = ElementCompositionPreview.GetElementVisual(page).Compositor; } var visual = ElementCompositionPreview.GetElementVisual(page); visual.Offset = new Vector3(140, 0, 0); visual.Opacity = 0f; visual.Scale = new Vector3(1, 1, 0); KeyFrameAnimation offsetInAnimation = _compositor.CreateScalarKeyFrameAnimation(); offsetInAnimation.InsertExpressionKeyFrame(1f, "0"); offsetInAnimation.Duration = TimeSpan.FromMilliseconds(250); KeyFrameAnimation fadeAnimation = _compositor.CreateScalarKeyFrameAnimation(); fadeAnimation.InsertExpressionKeyFrame(1f, "1"); fadeAnimation.Duration = TimeSpan.FromMilliseconds(250); visual.StartAnimation("Offset.X", offsetInAnimation); visual.StartAnimation("Opacity", fadeAnimation); await Task.Delay(fadeAnimation.Duration); } }
/// <summary> /// Inserts a KeyFrame whose value is calculated using the specified ExpressionNode. /// </summary> /// <param name="keyframeAnimation">The keyframe animation.</param> /// <param name="normalizedProgressKey">The time the key frame should occur at, expressed as a percentage of the animation Duration. Allowed value is from 0.0 to 1.0.</param> /// <param name="expressionNode">The root ExpressionNode that represents the ExpressionAnimation.</param> /// <param name="easing">The easing function to use when interpolating between frames.</param> public static void InsertExpressionKeyFrame(this KeyFrameAnimation keyframeAnimation, float normalizedProgressKey, ExpressionNode expressionNode, CompositionEasingFunction easing = null) { expressionNode.ClearReferenceInfo(); keyframeAnimation.InsertExpressionKeyFrame(normalizedProgressKey, expressionNode.ToExpressionString(), easing); expressionNode.SetAllParameters(keyframeAnimation); }
/// <summary> /// Inserts a KeyFrame whose value is calculated using the specified ExpressionNode. /// </summary> /// <param name="keyframeAnimation">The keyframe animation.</param> /// <param name="normalizedProgressKey">The time the key frame should occur at, expressed as a percentage of the animation Duration. Allowed value is from 0.0 to 1.0.</param> /// <param name="expressionNode">The root ExpressionNode that represents the ExpressionAnimation.</param> /// <param name="easing">The easing function to use when interpolating between frames.</param> public static void InsertExpressionKeyFrame(this KeyFrameAnimation keyframeAnimation, float normalizedProgressKey, ExpressionNode expressionNode, CompositionEasingFunction easing = null) { #if NETFX_CORE // UNO TODO keyframeAnimation.InsertExpressionKeyFrame(normalizedProgressKey, expressionNode.ToExpressionString(), easing); #endif expressionNode.SetAllParameters(keyframeAnimation); }
private async Task AnimateScaleIn() { var newPage = frame.Content; if (newPage != null) { var page = newPage as FrameworkElement; if (_compositor == null) { _compositor = ElementCompositionPreview.GetElementVisual(page).Compositor; } KeyFrameAnimation scaleAnimation = _compositor.CreateScalarKeyFrameAnimation(); scaleAnimation.InsertExpressionKeyFrame(0f, ".005"); //scaleAnimation.InsertExpressionKeyFrame(0.5f, ".8"); scaleAnimation.InsertExpressionKeyFrame(1f, "1"); scaleAnimation.Duration = TimeSpan.FromMilliseconds(700); KeyFrameAnimation fadeAnimation = _compositor.CreateScalarKeyFrameAnimation(); fadeAnimation.InsertExpressionKeyFrame(1f, "1"); fadeAnimation.Duration = TimeSpan.FromMilliseconds(1); var visual = ElementCompositionPreview.GetElementVisual(page); visual.Opacity = 0; //sets initial opacity to 0, since we will be animating it to 1 //this loop is needed, so that we don't continue until the page is actually generated (otherwise, the size of the visual gets reported as 0) while (visual.Size.X == 0) { await Task.Delay(1); } visual.CenterPoint = new Vector3(visual.Size.X / 2, visual.Size.Y / 2, 0); //sets the center point of the visual (this is used as the anchor point of the scale animation) visual.StartAnimation("Scale.X", scaleAnimation); visual.StartAnimation("Scale.Y", scaleAnimation); visual.StartAnimation("Opacity", fadeAnimation); CompositionEasingFunction eaze; await Task.Delay(700); //waits until the animation completes in order to continue } }
internal static KeyFrameAnimation InsertExpressionLambdaKeyFrame(KeyFrameAnimation animation, float normalizedProgressKey, Expression expression) { var ce = ExpressionToCompositionExpression(expression); animation.InsertExpressionKeyFrame(normalizedProgressKey, ce.Expression); ApplyParameters(animation, ce.Parameters); return(animation); }
private void ItemContainer_Loaded(object sender, RoutedEventArgs e) { var itemsPanel = (ItemsWrapGrid)this.PhotoCollectionViewer.ItemsPanelRoot; var itemContainer = (GridViewItem)sender; var itemIndex = this.PhotoCollectionViewer.IndexFromContainer(itemContainer); var relativeIndex = itemIndex - itemsPanel.FirstVisibleIndex; var uc = itemContainer.ContentTemplateRoot as Grid; if (itemIndex != persistedItemIndex && itemIndex >= 0 && itemIndex >= itemsPanel.FirstVisibleIndex && itemIndex <= itemsPanel.LastVisibleIndex) { var itemVisual = ElementCompositionPreview.GetElementVisual(uc); ElementCompositionPreview.SetIsTranslationEnabled(uc, true); // Create KeyFrameAnimations KeyFrameAnimation offsetAnimation = _compositor.CreateScalarKeyFrameAnimation(); offsetAnimation.InsertExpressionKeyFrame(0f, "100"); offsetAnimation.InsertExpressionKeyFrame(1f, "0"); offsetAnimation.DelayBehavior = AnimationDelayBehavior.SetInitialValueBeforeDelay; offsetAnimation.Duration = TimeSpan.FromMilliseconds(1800); offsetAnimation.DelayTime = TimeSpan.FromMilliseconds(relativeIndex * 50); KeyFrameAnimation fadeAnimation = _compositor.CreateScalarKeyFrameAnimation(); fadeAnimation.InsertExpressionKeyFrame(0f, "0"); fadeAnimation.InsertExpressionKeyFrame(1f, "1"); fadeAnimation.DelayBehavior = AnimationDelayBehavior.SetInitialValueBeforeDelay; fadeAnimation.Duration = TimeSpan.FromMilliseconds(1800); fadeAnimation.DelayTime = TimeSpan.FromMilliseconds(relativeIndex * 50); // Start animations itemVisual.StartAnimation("Offset.Y", offsetAnimation); //itemVisual.StartAnimation("Scale", scaleAnimation); itemVisual.StartAnimation("Opacity", fadeAnimation); } else { Debug.WriteLine("sss"); } itemContainer.Loaded -= this.ItemContainer_Loaded; }
private async Task AnimatePageOut() { var newPage = frame.Content; if (newPage != null) { var page = newPage as FrameworkElement; if (_compositor == null) { _compositor = ElementCompositionPreview.GetElementVisual(page).Compositor; } var visual = ElementCompositionPreview.GetElementVisual(page); //var easeIn = _compositor.CreateCubicBezierEasingFunction(new Vector2(0.5f, 0.0f), new Vector2(1.0f, 1.0f)); //var step = _compositor.CreateStepEasingFunction(); //KeyFrameAnimation offsetInAnimation = _compositor.CreateScalarKeyFrameAnimation(); //offsetInAnimation.InsertExpressionKeyFrame(1f, "-140"); //offsetInAnimation.Duration = TimeSpan.FromMilliseconds(250); //KeyFrameAnimation fadeAnimation = _compositor.CreateScalarKeyFrameAnimation(); //fadeAnimation.InsertExpressionKeyFrame(1f, "0"); //fadeAnimation.Duration = TimeSpan.FromMilliseconds(200); //visual.StartAnimation("Offset.Y", offsetInAnimation); //visual.StartAnimation("Opacity", fadeAnimation); int windowHeight = (int)Window.Current.Bounds.Height; //visual.Offset = new Vector3(0, windowHeight, 0); visual.Opacity = 1f; visual.Scale = new Vector3(1, 1, 0); KeyFrameAnimation offsetInAnimation = _compositor.CreateScalarKeyFrameAnimation(); offsetInAnimation.InsertExpressionKeyFrame(1f, $"{windowHeight}" /*, step*/); offsetInAnimation.Duration = TimeSpan.FromMilliseconds(500); KeyFrameAnimation fadeAnimation = _compositor.CreateScalarKeyFrameAnimation(); fadeAnimation.InsertExpressionKeyFrame(1f, "1"); fadeAnimation.Duration = TimeSpan.FromMilliseconds(1); visual.StartAnimation("Offset.Y", offsetInAnimation); //visual.StartAnimation("Opacity", fadeAnimation); //await page.Fade(1, 250).Offset(0, 140, 250, 0, EasingType.Quadratic).StartAsync(); await Task.Delay(500); //waits until the animation completes in order to continue /*await Task.Delay(250);*/ //waits until the animation completes in order to continue } }
public bool TryInsertExpressionKeyFrame(KeyFrameAnimation animation, TimeSpan duration) { if (this.expression is null) { return(false); } CompositionEasingFunction?easingFunction = animation.Compositor.TryCreateEasingFunction(EasingType, EasingMode); if (easingFunction is null) { animation.InsertExpressionKeyFrame(GetNormalizedProgress(duration), this.expression); } else { animation.InsertExpressionKeyFrame(GetNormalizedProgress(duration), this.expression, easingFunction); } return(true); }
private void ItemContainer_Loaded(object sender, RoutedEventArgs e) { var itemsPanel = (ItemsStackPanel)ActivityList.ItemsPanelRoot; var itemContainer = (ListViewItem)sender; var itemIndex = ActivityList.IndexFromContainer(itemContainer); var uc = itemContainer.ContentTemplateRoot as FrameworkElement; var childPanel = uc.FindName("ActivityListItemPanel") as RelativePanel; // Don't animate if we're not in the visible viewport if (itemIndex >= itemsPanel.FirstVisibleIndex && itemIndex <= itemsPanel.LastVisibleIndex) { var itemVisual = ElementCompositionPreview.GetElementVisual(uc); float width = (float)childPanel.RenderSize.Width; float height = (float)childPanel.RenderSize.Height; itemVisual.Size = new Vector2(width, height); itemVisual.CenterPoint = new Vector3(width / 2, height / 2, 0f); itemVisual.Scale = new Vector3(1, 1, 1); // new Vector3(0.25f, 0.25f, 0); itemVisual.Opacity = 0f; itemVisual.Offset = new Vector3(0, 100, 0); var relativeIndex = itemIndex - itemsPanel.FirstVisibleIndex; // Create KeyFrameAnimations KeyFrameAnimation offsetAnimation = Compositor.CreateScalarKeyFrameAnimation(); offsetAnimation.InsertExpressionKeyFrame(1f, "0"); offsetAnimation.Duration = TimeSpan.FromMilliseconds(1250); offsetAnimation.DelayTime = TimeSpan.FromMilliseconds(relativeIndex * 100); Vector3KeyFrameAnimation scaleAnimation = Compositor.CreateVector3KeyFrameAnimation(); scaleAnimation.InsertKeyFrame(0, new Vector3(1f, 1f, 0f)); scaleAnimation.InsertKeyFrame(0.1f, new Vector3(0.05f, 0.05f, 0.05f)); scaleAnimation.InsertKeyFrame(1f, new Vector3(1f, 1f, 0f)); scaleAnimation.Duration = TimeSpan.FromMilliseconds(1000); scaleAnimation.DelayTime = TimeSpan.FromMilliseconds(relativeIndex * 100); KeyFrameAnimation fadeAnimation = Compositor.CreateScalarKeyFrameAnimation(); fadeAnimation.InsertExpressionKeyFrame(1f, "1"); fadeAnimation.Duration = TimeSpan.FromMilliseconds(500); fadeAnimation.DelayTime = TimeSpan.FromMilliseconds(relativeIndex * 100); // Start animations itemVisual.StartAnimation("Offset.Y", offsetAnimation); itemVisual.StartAnimation("Scale", scaleAnimation); itemVisual.StartAnimation("Opacity", fadeAnimation); } itemContainer.Loaded -= ItemContainer_Loaded; }
public static ImplicitAnimationCollection CreateImplicitAnimation(this ImplicitAnimationCollection source, string Target, TimeSpan?Duration = null) { KeyFrameAnimation animation = null; switch (Target.ToLower()) { case "offset": case "scale": case "centerPoint": case "rotationAxis": animation = source.Compositor.CreateVector3KeyFrameAnimation(); break; case "size": animation = source.Compositor.CreateVector2KeyFrameAnimation(); break; case "opacity": case "blueRadius": case "rotationAngle": case "rotationAngleInDegrees": animation = source.Compositor.CreateScalarKeyFrameAnimation(); break; case "color": animation = source.Compositor.CreateColorKeyFrameAnimation(); break; } if (animation == null) { throw new ArgumentNullException("未知的Target"); } if (!Duration.HasValue) { Duration = TimeSpan.FromSeconds(0.2d); } animation.InsertExpressionKeyFrame(1f, "this.FinalValue"); animation.Duration = Duration.Value; animation.Target = Target; source[Target] = animation; return(source); }
public static void CreateAnimation(CompositionObject obj, string Target, TimeSpan Duration) { var compositor = obj.Compositor; KeyFrameAnimation an = null; if (ScalarTargets.Contains(Target)) an = compositor.CreateScalarKeyFrameAnimation(); if (Vector2Targets.Contains(Target)) an = compositor.CreateVector2KeyFrameAnimation(); if (Vector3Targets.Contains(Target)) an = compositor.CreateVector3KeyFrameAnimation(); if (Vector4Targets.Contains(Target)) an = compositor.CreateVector4KeyFrameAnimation(); if (QuaternionTargets.Contains(Target)) an = compositor.CreateQuaternionKeyFrameAnimation(); if (ColorTargets.Contains(Target)) an = compositor.CreateColorKeyFrameAnimation(); if (an == null) return; an.InsertExpressionKeyFrame(1f, "this.FinalValue"); an.Duration = Duration; an.Target = Target; if (obj.ImplicitAnimations == null) { obj.ImplicitAnimations = compositor.CreateImplicitAnimationCollection(); } obj.ImplicitAnimations[Target] = an; }
public static void CreateAnimation<T>(CompositionObject obj, string Target, TimeSpan Duration) where T : struct { var compositor = obj.Compositor; KeyFrameAnimation an = null; if (typeof(T) == typeof(float)) an = compositor.CreateScalarKeyFrameAnimation(); if (typeof(T) == typeof(Vector2)) an = compositor.CreateVector2KeyFrameAnimation(); if (typeof(T) == typeof(Vector3)) an = compositor.CreateVector3KeyFrameAnimation(); if (typeof(T) == typeof(Vector4)) an = compositor.CreateVector4KeyFrameAnimation(); if (typeof(T) == typeof(Quaternion)) an = compositor.CreateQuaternionKeyFrameAnimation(); if (typeof(T) == typeof(Color)) an = compositor.CreateColorKeyFrameAnimation(); if (an == null) return; an.InsertExpressionKeyFrame(1f, "this.FinalValue"); an.Duration = Duration; an.Target = Target; if (obj.ImplicitAnimations == null) { obj.ImplicitAnimations = compositor.CreateImplicitAnimationCollection(); } obj.ImplicitAnimations[Target] = an; }
internal async static Task FastSlideOutReverse(Frame frame) { if (frame.Content is Page page) { if (page.Background != null) { frame.Background = page.Background; } else if (page.Content is Panel panel) { if (panel.Background != null) { frame.Background = panel.Background; } else { frame.Background = (SolidColorBrush)Application.Current.Resources[systemBackgroundColourKey]; } } if (_compositor == null) { _compositor = ElementCompositionPreview.GetElementVisual(page).Compositor; } var visual = ElementCompositionPreview.GetElementVisual(page); KeyFrameAnimation offsetInAnimation = _compositor.CreateScalarKeyFrameAnimation(); string offsetToUse = $"{140}"; offsetInAnimation.InsertExpressionKeyFrame(1f, offsetToUse); offsetInAnimation.Duration = TimeSpan.FromMilliseconds(300); visual.StartAnimation("Offset.X", offsetInAnimation); await Task.Delay(100); } }
internal async static Task FastSlideInReverse(Frame frame) { if (frame.Content is Page page) { if (_compositor == null) { _compositor = ElementCompositionPreview.GetElementVisual(page).Compositor; } var visual = ElementCompositionPreview.GetElementVisual(page); visual.Offset = new Vector3(-((float)frame.ActualWidth - 140), 0, 0); KeyFrameAnimation offsetInAnimation = _compositor.CreateScalarKeyFrameAnimation(); offsetInAnimation.InsertExpressionKeyFrame(1f, "0"); offsetInAnimation.Duration = TimeSpan.FromMilliseconds(300); visual.StartAnimation("Offset.X", offsetInAnimation); await Task.Delay(offsetInAnimation.Duration); } }
internal async static Task ColorTransitionIn(Frame frame) { if (frame.Content is Page page) { if (_compositor == null) { _compositor = ElementCompositionPreview.GetElementVisual(page).Compositor; } var visual = ElementCompositionPreview.GetElementVisual(page); visual.Opacity = 0f; KeyFrameAnimation opacityAnimation = _compositor.CreateScalarKeyFrameAnimation(); opacityAnimation.InsertExpressionKeyFrame(1f, "1"); opacityAnimation.Duration = TimeSpan.FromMilliseconds(1000); visual.StartAnimation("Opacity", opacityAnimation); await Task.Delay(opacityAnimation.Duration); } }
private void ItemContainer_Loaded(object sender, RoutedEventArgs e) { var itemsPanel = (ItemsWrapGrid)gridviewImages.ItemsPanelRoot; var itemContainer = (GridViewItem)sender; var itemIndex = gridviewImages.IndexFromContainer(itemContainer); var uc = itemContainer.ContentTemplateRoot as FrameworkElement; //Debug.WriteLine(itemContainer.ActualWidth); //Debug.WriteLine(itemContainer.ActualHeight); //Don't animate if we're not in the visible viewport if (itemIndex >= itemsPanel.FirstVisibleIndex && itemIndex <= itemsPanel.LastVisibleIndex) { var itemVisual = ElementCompositionPreview.GetElementVisual(uc); float width = (float)itemContainer.ActualWidth; float height = (float)itemContainer.ActualHeight; itemVisual.Size = new Vector2(width, height); itemVisual.CenterPoint = new Vector3(width / 2, height / 2, 1); //GetCenterPoint2(itemContainer, itemContainer.ActualWidth); itemVisual.Offset = new Vector3(0, 25, 0); itemVisual.Scale = new Vector3(1, 1, 0); var relativeIndex = itemIndex - itemsPanel.FirstVisibleIndex; // Create KeyFrameAnimations KeyFrameAnimation scaleXAnimation = compositor.CreateScalarKeyFrameAnimation(); scaleXAnimation.InsertExpressionKeyFrame(1f, "0", compositor.CreateCubicBezierEasingFunction(new Vector2(0, 0), new Vector2(0.58f, 1))); scaleXAnimation.Duration = TimeSpan.FromMilliseconds(200); // Start animations itemVisual.StartAnimation("Offset.Y", scaleXAnimation); } itemContainer.Loaded -= ItemContainer_Loaded; }
private async void OnPageLoaded(object sender, RoutedEventArgs e) { _compositor = Window.Current.Compositor; _generator = _compositor.CreateCompositionGenerator(); var gridSize = new Vector2((float)RootGrid.ActualWidth, (float)RootGrid.ActualHeight); var anim = _compositor.CreatePathKeyFrameAnimation(); _rootVisual = _compositor.CreateSpriteVisual(); _rootVisual.Size = gridSize; // Create the surface brush from the image var imageSurface = await _generator.CreateImageSurfaceAsync( new Uri("ms-appx:///Assets/Images/Cat.png"), new Size(400, 400), ImageSurfaceOptions.Default); var imageBrush = _compositor.CreateSurfaceBrush(imageSurface); // Create the clipped visuals for (var i = 0; i < 145; i++) { var visual = _compositor.CreateSpriteVisual(); visual.Offset = new Vector3(400, 400, 0); visual.Size = new Vector2(400, 400); visual.Brush = imageBrush; visual.AnchorPoint = new Vector2(0.5f); var radius = 290 - (i * 2); // Create the GeometricClip for this visual var clipGeometry = CanvasGeometry.CreateCircle(null, new Vector2(200, 200), radius); visual.Clip = _compositor.CreateGeometricClip(clipGeometry); _rootVisual.Children.InsertAtTop(visual); _visuals.Add(visual); } // Display the rootVisual ElementCompositionPreview.SetElementChildVisual(RootGrid, _rootVisual); // Reverse the visuals list so that the items in the list are now sorted // in z-order from top to bottom _visuals.Reverse(); // The topmost visual would track the pointer position _dragVisual = _visuals.First(); // Get the CompositionPropertySet which tracks the pointer position on the RootGrid _pointerTrackerSet = ElementCompositionPreview.GetPointerPositionPropertySet(RootGrid); // Animate the topmost visual so that it tracks and follows the pointer position _pointerTrackerAnimation = _compositor.GenerateVector3KeyFrameAnimation() .HavingDuration(PointerTrackerAnimationDuration) .RepeatsForever(); _pointerTrackerAnimation.InsertExpressionKeyFrame(0f, c => new VisualTarget().Offset); _pointerTrackerAnimation.InsertExpressionKeyFrame( 1f, c => c.Lerp(new VisualTarget().Offset, _pointerTrackerSet.Get <Vector3>("Position"), DefaultLerpAmount), _compositor.CreateEaseOutQuinticEasingFunction()); // Animate the remaining visuals in such a way that each visual tracks and follows the // position of the visual above it. var prevChild = _dragVisual; foreach (var child in _visuals.Skip(1)) { var offsetAnimation = _compositor.GenerateVector3KeyFrameAnimation() .HavingDuration(ChildOffsetAnimationDuration) .RepeatsForever(); offsetAnimation.InsertExpressionKeyFrame(0f, c => new VisualTarget().Offset); offsetAnimation.InsertExpressionKeyFrame( 1f, c => c.Lerp(new VisualTarget().Offset, prevChild.Offset, DefaultLerpAmount), _compositor.CreateEaseOutQuinticEasingFunction()); child.StartAnimation(() => child.Offset, offsetAnimation); prevChild = child; } }
public override void AddKayFrameToAnimation(KeyFrameAnimation animation) { animation.InsertExpressionKeyFrame((float)Progress, Expression, EasingFunction.CreateCompositionEasingFunction(animation.Compositor)); }
/// <summary> /// ---- UI.Composition その3 ----- /// UI.Compositionの作業を行うメイン /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ItemContainer_Loaded(object sender, RoutedEventArgs e) { // 一回だけでいいのでイベント外す var itemContainer = sender as SelectorItem; itemContainer.Loaded -= ItemContainer_Loaded; var itemsPanel = (ItemsWrapGrid)itemGridView.ItemsPanelRoot; var itemIndex = itemGridView.IndexFromContainer(itemContainer); var gd = itemContainer.ContentTemplateRoot as Grid; // 見えてるアイテム限定 このため、アニメ中にスクロールがーっとすると見えてる所からアニメするのが見られる if (/*-1 != itemIndex && */ itemIndex >= itemsPanel.FirstVisibleIndex && itemIndex <= itemsPanel.LastVisibleIndex) { // 定石 ElementCompositionPreview.GetElementVisual で これから作業するUIElementの「Visual」を取得 // ここではitemContainer...GridViewItemのコンテナ、を単位として、そいつの描画をいじくることになる var itemVisual = ElementCompositionPreview.GetElementVisual(itemContainer); // Visualの初期値設定 float width = (float)gd.RenderSize.Width; float height = (float)gd.RenderSize.Height; itemVisual.Size = new Vector2(width, height); itemVisual.CenterPoint = new Vector3(width / 2, height / 2, 0f); // アニメで使うイージングの設定 ベジェ曲線でイージングのカーブを設定するタイプ CSSとかと同じ // CSSのベジェ設定データをそのまま使い回せる // 今回はこちらのデータを使用しました // http://www.knockknock.jp/archives/184 // 加速度付けた動きがカッコイイ(と思う)のでそういうのを設定 var qubicEaseIn = _compositor.CreateCubicBezierEasingFunction(new Vector2(0.55f, 0.555f), new Vector2(0.675f, 0.19f)); var qubicEaseOut = _compositor.CreateCubicBezierEasingFunction(new Vector2(0.215f, 0.61f), new Vector2(0.355f, 1f)); // ここからアニメーション4種類を別々に設定 // StartAnimationはここを抜けたら一斉に(同時に)始まるので ここでの書き順は特に影響がない // 1 オフセット ここでは左から右にアイテムを動かす KeyFrameAnimation offsetAnimation = _compositor.CreateScalarKeyFrameAnimation(); offsetAnimation.InsertExpressionKeyFrame(1f, "0", qubicEaseOut); offsetAnimation.Duration = TimeSpan.FromMilliseconds(nAnimationDulation); // ItemIndex毎にアニメーションのスタートを少しづつ遅らせて順にびろろろろーんという効果を出す offsetAnimation.DelayTime = TimeSpan.FromMilliseconds(itemIndex * GRIDITEM_ANIMATION_DELAYOFFSET); // 初期値とStartAnimation itemVisual.Offset = new Vector3(-300, 0, 0); // 第一パラメータで渡しているのはこのAnimationで動かすitemVisualのプロパティ名 itemVisual.StartAnimation(nameof(itemVisual.Offset) + "." + nameof(itemVisual.Offset.X), offsetAnimation); // 2 回転 ここではZ軸でくるっと回す KeyFrameAnimation rotAnimation = _compositor.CreateScalarKeyFrameAnimation(); // KeyFrame "1"がアニメ終了地点 rotAnimation.InsertExpressionKeyFrame(1f, "0", qubicEaseOut); rotAnimation.Duration = TimeSpan.FromMilliseconds(nAnimationDulation); rotAnimation.DelayTime = TimeSpan.FromMilliseconds(itemIndex * GRIDITEM_ANIMATION_DELAYOFFSET); // Z軸に-90回転,を初期値とする itemVisual.RotationAxis = new Vector3(0, 0f, 1f); itemVisual.RotationAngleInDegrees = -90; itemVisual.StartAnimation(nameof(itemVisual.RotationAngleInDegrees), rotAnimation); // 3 スケール ここでは3倍から1倍に縮小する // ちなみに、1倍以下から拡大する場合描画が微妙に変…な場合がある Vector3KeyFrameAnimation scaleAnimation = _compositor.CreateVector3KeyFrameAnimation(); //scaleAnimation.InsertKeyFrame(0, new Vector3(1f, 1f, 0f)); scaleAnimation.InsertKeyFrame(0, new Vector3(3f, 3f, 0f)); //scaleAnimation.InsertKeyFrame(0.1f, new Vector3(0.05f, 0.05f, 0.05f)); scaleAnimation.InsertKeyFrame(1f, new Vector3(1f, 1f, 0f), qubicEaseIn); scaleAnimation.Duration = TimeSpan.FromMilliseconds(nAnimationDulation); scaleAnimation.DelayTime = TimeSpan.FromMilliseconds(itemIndex * GRIDITEM_ANIMATION_DELAYOFFSET); itemVisual.Scale = new Vector3(1, 1, 1); itemVisual.StartAnimation(nameof(itemVisual.Scale), scaleAnimation); // 4 フェード 透明度を0から1へ変化させる KeyFrameAnimation fadeAnimation = _compositor.CreateScalarKeyFrameAnimation(); fadeAnimation.InsertExpressionKeyFrame(1f, "1", qubicEaseIn); fadeAnimation.Duration = TimeSpan.FromMilliseconds(nAnimationDulation); fadeAnimation.DelayTime = TimeSpan.FromMilliseconds(itemIndex * GRIDITEM_ANIMATION_DELAYOFFSET); itemVisual.Opacity = 0f; itemVisual.StartAnimation(nameof(itemVisual.Opacity), fadeAnimation); } }