『QQ:1353814576』

WPF 实现全屏弹幕滚动效果


WPF 程序里怎么实现全屏弹幕滚动效果

某次公司开年会上,为了活跃气氛,使用了一个全屏互动弹幕的软件,挺有意思的。基于微信公众号,微信用户只需要向关注的公众号发送文字、图像或者小视频,大屏幕上面就会以弹幕的方式滚动展现出来,出于爱好闲暇时间自己也就研究了下;

服务端开发:

也不复杂 ,需要一个网站交互服务器(用来接收微信的交互信息、以及新消息推送接口),以及一个微信公众号(可以使用测试号 权限比较高)然后再微信公众平台上面把开发者信息配置好即可(具体配置可以去看微信的开发文档)

客户端开发:

需要 采用轮询或者使用长连接等方式 来定时或实时接收新消息推送 用来展现到界面上


麻烦一点的就是wpf 实现弹幕效果,毕竟不像web端那样有很多弹幕jquery插件 基本都需要自己去实现

以下是自己写的一个弹幕控件类

///自定义控件  
namespace BarrageControlLibrary  
{  
  
    /// <summary>  
    /// 纯文字弹幕控件  
    /// </summary>  
    public class TextBlockBarrage : TextBlock  
    {  
        TranslateTransform TranslateTransformClass;  
        /// <summary>  
        /// 获取或设置控件动画执行时长 秒  
        /// </summary>  
        public double FromSeconds { get; set; }  
        /// <summary>  
        /// 加载时间  
        /// </summary>  
        public DateTime LoadingTime { get; set; }  
        /// <summary>  
        /// 运行完毕离左边的距离  
        /// </summary>  
        public double Translation_Left { get; set; }  
        /// <summary>  
        /// 运行完毕离右边边的距离  
        /// </summary>  
        public double Translation_Right { get; set; }  
  
        public bool Enabled { get; set; }  
        /// <summary>  
        /// 初始化  
        /// </summary>  
        public TextBlockBarrage()  
            : base()  
        {  
  
            LoadingTime = DateTime.Now;  
            TranslateTransformClass = new TranslateTransform();  
            this.RenderTransform = TranslateTransformClass;  
            this.Loaded += new RoutedEventHandler(TextBlockBarrage_Loaded);  
        }  
  
  
  
        /// <summary>  
        /// 加载触发时间  
        /// </summary>  
        /// <param name="sender"></param>  
        /// <param name="e"></param>  
        void TextBlockBarrage_Loaded(object sender, RoutedEventArgs e)  
        {  
            if (TranslateTransformClass == null)  
                return;  
            if (!Enabled)  
            {  
                return;  
            }  
            else  
            {  
                Enabled = false;  
            }  
            //执行时间  
            Duration duration = new Duration(TimeSpan.FromSeconds(FromSeconds));  
            DoubleAnimation da = new DoubleAnimation(Translation_Left, Translation_Right, duration);  
            da.AutoReverse = false;  
            da.FillBehavior = FillBehavior.HoldEnd;  
  
            TranslateTransformClass.BeginAnimation(TranslateTransform.XProperty, da);  
            this.Loaded -= new RoutedEventHandler(TextBlockBarrage_Loaded);  
        }  
  
  
    }  
  
    /// <summary>  
    /// 纯图片弹幕控件  
    /// </summary>  
    public class ImageBarrage : Image  
    {  
        TranslateTransform TranslateTransformClass;  
        /// <summary>  
        /// 获取或设置控件动画执行时长 秒  
        /// </summary>  
        public double FromSeconds { get; set; }  
        /// <summary>  
        /// 加载时间  
        /// </summary>  
        public DateTime LoadingTime { get; set; }  
        /// <summary>  
        /// 运行完毕离左边的距离  
        /// </summary>  
        public double Translation_Left { get; set; }  
        /// <summary>  
        /// 运行完毕离右边边的距离  
        /// </summary>  
        public double Translation_Right { get; set; }  
        /// <summary>  
        /// 初始化  
        /// </summary>  
        public ImageBarrage()  
            : base()  
        {  
            LoadingTime = DateTime.Now;  
            TranslateTransformClass = new TranslateTransform();  
            this.RenderTransform = TranslateTransformClass;  
            this.Loaded += new RoutedEventHandler(ImageBarrage_Loaded);  
        }  
        /// <summary>  
        /// 加载触发时间  
        /// </summary>  
        /// <param name="sender"></param>  
        /// <param name="e"></param>  
        void ImageBarrage_Loaded(object sender, RoutedEventArgs e)  
        {  
            if (TranslateTransformClass == null)  
                return;  
  
            //执行时间  
            Duration duration = new Duration(TimeSpan.FromSeconds(FromSeconds));  
            DoubleAnimation da = new DoubleAnimation(Translation_Left, Translation_Right, duration);  
            da.AutoReverse = false;  
            da.FillBehavior = FillBehavior.HoldEnd;  
            TranslateTransformClass.BeginAnimation(TranslateTransform.XProperty, da);  
            this.Loaded -= new RoutedEventHandler(ImageBarrage_Loaded);  
  
        }  
  
    }  
  
    /// <summary>  
    /// 可编辑弹幕控件(高级功能)  
    /// </summary>  
    public class SeniorBarrageGrid : Grid  
    {  
        TranslateTransform TranslateTransformClass;  
        /// <summary>  
        /// 获取或设置控件动画执行时长 秒  
        /// </summary>  
        public double FromSeconds { get; set; }  
        /// <summary>  
        /// 加载时间  
        /// </summary>  
        public DateTime LoadingTime { get; set; }  
        /// <summary>  
        /// 运行完毕离左边的距离  
        /// </summary>  
        public double Translation_Left { get; set; }  
        /// <summary>  
        /// 运行完毕离右边边的距离  
        /// </summary>  
        public double Translation_Right { get; set; }  
  
        public bool Enabled { get; set; }  
        /// <summary>  
        /// 初始化  
        /// </summary>  
        public SeniorBarrageGrid()  
            : base()  
        {  
  
            LoadingTime = DateTime.Now;  
            TranslateTransformClass = new TranslateTransform();  
            this.RenderTransform = TranslateTransformClass;  
            this.Loaded += new RoutedEventHandler(SeniorBarrageGrid_Loaded);  
        }  
  
  
  
        /// <summary>  
        /// 加载触发时间  
        /// </summary>  
        /// <param name="sender"></param>  
        /// <param name="e"></param>  
        void SeniorBarrageGrid_Loaded(object sender, RoutedEventArgs e)  
        {  
            if (TranslateTransformClass == null)  
                return;  
            if (!Enabled)  
            {  
                return;  
            }  
            else  
            {  
                Enabled = false;  
            }  
  
            Translation_Right = Translation_Right > 0 ? Translation_Right * -1 : Translation_Right;  
            //执行时间  
            Duration duration = new Duration(TimeSpan.FromSeconds(FromSeconds));  
            DoubleAnimation da = new DoubleAnimation(Translation_Left, Translation_Right, duration);  
            da.AutoReverse = false;  
            da.FillBehavior = FillBehavior.HoldEnd;  
  
            TranslateTransformClass.BeginAnimation(TranslateTransform.XProperty, da);  
            this.Loaded -= new RoutedEventHandler(SeniorBarrageGrid_Loaded);  
        }  
    }  
}

模仿的客户端界面如下 基于 WPF .net 4.5 删除了联网模块 直接可以运行 有兴趣的可以下载看看

下载源码 解压密码 www.yuantk.com