【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提示消息

时间: 2024-08-09 07:17:31

【WP8】仿QQ提示消息的相关文章

Android UI设计: 分享一个仿QQ聊天消息提示可以拖拉气泡

首先上效果图 功能有: 1. 可以随时拖拉 2. 拖拉超过一定距离会监听 3. 拖拉返回的时候,有来回反弹效果 此效果先是参照了网上github两个版本的效果.不过都不是自己想要那么理想. 1.其中有一个是两层,一层是textview控件和一层surfaceview.经测试效果不错,但是效率不高,在刚点击的有闪动现象.会跳帧.于是放弃这种方法.不过它能够全屏拖拉. 2另一个的实现方法很赞,全程一个view就完事,全部自绘,没有用控件.而且贝塞尔曲线就是中间那个瘦瘦的,随着距离越来越瘦的,是两条贝

仿QQ电话/消息切换的自定义布局结合Fragment解决你的需求!

转载请注明出处:王亟亟的大牛之路 先上模仿的对象:QQ的电话/消息 界面 用户点击消息或者电话会切换不同的界面 然后再上自己实现的界面 然后再附带了一些每一个Fragment内部的操作,来模拟切换后的效果 实现方法: 一个自定义控件+下面的Fragment.利用setOnSegmentControlViewClickListener方法来监听用户的点击来对界面进行操作. 项目目录结构 一个主Activity加一系列分页的Fragment(其实这里可以用Java代码来添加Fragment,但是考虑

从仿QQ消息提示框来谈弹出式对话框

<代码里的世界> -UI篇 用文字札记描绘自己 android学习之路 转载请保留出处 by Qiao http://blog.csdn.net/qiaoidea/article/details/45896477 [导航] - 自定义弹出式对话框的简单用法 列举各种常见的对话框实现方案 1.概述 android原生控件向来以丑著称(新推出的Material Design当另说),因此几乎所有的应用都会特殊定制自己的UI样式.而其中弹出式提示框的定制尤为常见,本篇我们将从模仿QQ退出提示框来看一

Android高仿QQ消息滑动删除(附源码)

大家都应该使用过QQ吧,他的消息中可以滑动删除功能,我觉得比较有意思,所以模仿写了一个,并且修改了其滑动算法.我先贴几个简单示范图吧 其实主要用的是算法以及对ListView的把控. 一下是适配器的类 ? 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

仿qq未读消息

仿qq未读消息 仿qq未读消息,拖拽删除 下载地址: 运行截图:    热门源码下载: 高仿京东商城 Android快速开发不可或缺的11个工具类 Android快速开发框架LoonAndroid Android应用源码比较不错的新闻客户端 版权声明:本文为博主原创文章,未经博主允许不得转载.

Socket实现仿QQ聊天(可部署于广域网)附源码(1)-简介

1.前言 本次实现的这个聊天工具是我去年c#程序设计课程所写的Socket仿QQ聊天,由于当时候没有自己的服务器,只能在机房局域网内进行测试,最近在腾讯云上买了一台云主机(本人学生党,腾讯云有个学生专享活动一元一个月的云服务器,如果还是学生的可以试一下,地址http://www.qcloud.com/event/qcloudSchool),经过重新编码实现了广域网聊天的功能.下面开始介绍我的自制聊天软件啦!!! 2.功能 1. 聊天室服务器端的创建. 2. 聊天室客户端的创建. 3. 实现客户与

仿QQ聊天软件2.0版

仿QQ聊天软件2.0版 转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907     上次课设做了Java版的仿QQ聊天程序,这次软件实训,我们继续完善了仿QQ聊天程序,将上次未完成及不完善的地方进行完善和改进,还新加了部分功能:表情输入.气泡模式.文件传输.截屏.语音聊天.逐步向QQ的基本功能靠齐.通过这次软件实训,又有了很多收获. 一.设计内容及要求 1.1综述 A.系统概述 我们要做的就是类似QQ这样的面向企业内部的聊天软件,基本功能和QQ类似.首先,

高仿QQ即时聊天软件开发系列之三登录窗口用户选择下拉框

上一篇高仿QQ即时聊天软件开发系列之二登录窗口界面写了一个大概的布局和原理 这一篇详细说下拉框的实现原理 先上最终效果图 一开始其实只是想给下拉框加一个placeholder效果,让下拉框在未选择未输入时显示一个提示字符串.由于Background对ComboBox无效,所以直接通过Background来实现是不行了.需要重新写ComboBox的模板,也就是Template,自定义一个模板来实现这个结果.又看了一下QQ的下拉框,这玩意不自定义也难以实现,所以就干脆自定义了. 先上代码,先是Com

Fragment,仿QQ空间

转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9023451          在今天的这篇文章当中,我依然会以实战加理论结合的方式教大家如何设计出自己觉得很炫的UI界面.好的,话不多说,进入正题.今天的这篇文章主要是以仿QQ空间的底部菜单栏效果为主,实现的效果有: <1>实现了点击按钮时的切换图片效果: <2>实现了点击按钮时的切换界面效果: <3>实现了点击中间圆形按钮时弹出菜单以及按钮图片切