【WP8】仿QQ提示消息

WP版的QQ提示消息的时候从顶部滑入,3秒后从顶部滑出,本文模仿该效果实现一个MessageToastManager类用于显示提示消息

思路很简单,就是动画而已,支持配置颜色和回掉

// *************************************************

// 

// 作者:bomo

// 小组:WP开发组

// 创建日期:2014/7/7 15:18:12

// 版本号:V1.00

// 说明: 

// 

// *************************************************

// 

// 修改历史: 

// Date                WhoChanges        Made 

// 2014/7/7 15:18:12            bomo         Initial creation 

//

// *************************************************



using System;

using System.Diagnostics;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Controls.Primitives;

using System.Windows.Media;

using System.Windows.Media.Animation;



namespace XTuOne.Utility.Helpers

{

    /// <summary>

    /// 消息提示工具

    /// </summary>

    public class MessageToastManager

    {

        private static readonly Color defaultForegroundColor = Color.FromArgb(255, 255, 144, 0);

        private static readonly Color defaultBackgroundColor = Colors.White;



        public static void Show(string text, Action complete = null, double height = 40)

        {

            Show(text, defaultForegroundColor, defaultBackgroundColor, complete, height);

        }

        

        public static void Show(string text, Color foregroundColor, Color backgroundColor, Action complete = null, double height = 40)

        {

            Show(text, new SolidColorBrush(foregroundColor), new SolidColorBrush(backgroundColor), complete, height);

        }



        public static void Show(string text, Brush foregroundBrush, Brush backgroundBrush, Action complete = null, double height = 40)

        {

            var p = new Popup

            {

                Child = new Border

                {

                    Width = Application.Current.Host.Content.ActualWidth,

                    Background = backgroundBrush,

                    Child = new TextBlock

                    {

                        Text = text,

                        Foreground = foregroundBrush,

                        FontSize = (double)Application.Current.Resources["PhoneFontSizeNormal"],

                        VerticalAlignment = VerticalAlignment.Center,

                        Margin = new Thickness(10, 0, 0, 0)

                    }

                }

            };



            Show(p, complete, height);

        }



        private static void Show(Popup popup, Action complete = null, double height = 40)

        {

            if (!(popup.Child.RenderTransform is CompositeTransform))

            {

                popup.Child.RenderTransform = new CompositeTransform();

            }

            ((CompositeTransform)popup.Child.RenderTransform).TranslateY = -height;



            Debug.Assert(popup.Child is FrameworkElement);



            var element =popup.Child as FrameworkElement;

            element.Height = height;



            var storyboard = new Storyboard

            {

                AutoReverse = false

            };



            var doubleAnimaionUsingKeyFrames = new DoubleAnimationUsingKeyFrames();

            Storyboard.SetTarget(doubleAnimaionUsingKeyFrames, popup.Child);

            Storyboard.SetTargetProperty(doubleAnimaionUsingKeyFrames, new PropertyPath("(UIElement.Opacity)", new object[0]));

            storyboard.Children.Add(doubleAnimaionUsingKeyFrames);

            

            //0.5秒透明度从0-1

            var doubleKeyFrame = new EasingDoubleKeyFrame

            {

                KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.5)),

                Value = 1,

                EasingFunction = new CubicEase {EasingMode = EasingMode.EaseOut}

            };

            doubleAnimaionUsingKeyFrames.KeyFrames.Add(doubleKeyFrame);

            doubleKeyFrame = new EasingDoubleKeyFrame

            {

                KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(2.4)),

                Value = 0.995,

                EasingFunction = new CubicEase { EasingMode = EasingMode.EaseIn }

            };

            doubleAnimaionUsingKeyFrames.KeyFrames.Add(doubleKeyFrame);

            doubleKeyFrame = new EasingDoubleKeyFrame

            {

                KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(3)),

                Value = 0.1,

            };

            doubleAnimaionUsingKeyFrames.KeyFrames.Add(doubleKeyFrame);





            

            doubleAnimaionUsingKeyFrames = new DoubleAnimationUsingKeyFrames();

            Storyboard.SetTarget(doubleAnimaionUsingKeyFrames, popup.Child);

            Storyboard.SetTargetProperty(doubleAnimaionUsingKeyFrames, new PropertyPath("(UIElement.RenderTransform).(CompositeTransform.TranslateY)", new object[0]));

            storyboard.Children.Add(doubleAnimaionUsingKeyFrames);

            doubleKeyFrame = new EasingDoubleKeyFrame

            {

                KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.5)),

                Value = 0,

                EasingFunction = new CubicEase { EasingMode = EasingMode.EaseOut }

            };

            doubleAnimaionUsingKeyFrames.KeyFrames.Add(doubleKeyFrame);

            doubleKeyFrame = new EasingDoubleKeyFrame

            {

                KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(2.4)),

                Value = 0,

            };

            doubleAnimaionUsingKeyFrames.KeyFrames.Add(doubleKeyFrame);

            doubleKeyFrame = new EasingDoubleKeyFrame

            {

                KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(3)),

                Value = -height,

                EasingFunction = new CubicEase { EasingMode = EasingMode.EaseIn }

            };

            doubleAnimaionUsingKeyFrames.KeyFrames.Add(doubleKeyFrame);



            var objectAnimaionUsingKeyFrames = new ObjectAnimationUsingKeyFrames();

            Storyboard.SetTarget(objectAnimaionUsingKeyFrames, popup);

            Storyboard.SetTargetProperty(objectAnimaionUsingKeyFrames, new PropertyPath("(Popup.IsOpen)", new object[0]));

            storyboard.Children.Add(objectAnimaionUsingKeyFrames);



            var discreteObjectKeyFrame = new DiscreteObjectKeyFrame

            {

                KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0)),

                Value = true

            };

            objectAnimaionUsingKeyFrames.KeyFrames.Add(discreteObjectKeyFrame);

            

            discreteObjectKeyFrame = new DiscreteObjectKeyFrame

            {

                KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(3)),

                Value = false

            };

            objectAnimaionUsingKeyFrames.KeyFrames.Add(discreteObjectKeyFrame);



            if (complete!=null)

            {

                storyboard.Completed += (s, e) => complete.Invoke();

            }



            storyboard.Begin();

        }

    }

}

 

【WP8】仿QQ提示消息

你可能感兴趣的:(qq)