Silverlight动画显示Line线

本文介绍如何在Silverlight中实现两点间连线的动画效果。利用Storyboard对象及其子元素DoubleAnimation,可控制线段端点的位置变化,实现动态画线。文章包含具体XAML代码示例。

目的:在silverlight中显示两点之间的连线,要求动画显示连线效果。

如果需实现动画效果不得不了解,Storyborad对象:

Storyboard

Silverlight
 

通过时间线控制动画,并为其子动画提供对象和属性目标信息。

XAML
 
<Storyboard   ...>
  oneOrMoreChildTimelines
</Storyboard>
 

描述

oneOrMoreChildTimelines

从 Timeline 派生的以下对象元素中的一个或多个:Storyboard、ColorAnimationColorAnimationUsingKeyFramesDoubleAnimationDoubleAnimationUsingKeyFramesPointAnimation或 PointAnimationUsingKeyFrames 在运行时访问 Children 属性时,此处定义的对象元素成为 Children 集合的成员。

从微软官网上定义,我们可以知道这个Storyborad正是实现动画的一个重要的元素。

备注
 

在对象加载或要启动、暂停、继续和停止动画时,可以使用 Storyboard 对象的交互式方法来自动启动演示图板。

Storyboard 是 Resources 属性唯一支持的资源类型。

从微软官网上我们得到这个东西需要可以定义一些诶设置在Canvas.Resources节点下,官网给出了一个Rectangle颜色变化的一个例子:

 1 <Canvas
 2   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
 4   <Rectangle
 5     x:Name="MyAnimatedRectangle"
 6     Width="100"
 7     Height="100"
 8     Fill="Blue">
 9     <Rectangle.Triggers>
10 
11       <!-- Animates the rectangle's opacity. -->
12       <EventTrigger RoutedEvent="Rectangle.Loaded">
13         <BeginStoryboard>
14           <Storyboard>
15             <DoubleAnimation
16               Storyboard.TargetName="MyAnimatedRectangle"
17               Storyboard.TargetProperty="Opacity"
18               From="1.0" To="0.0" Duration="0:0:5" AutoReverse="True" RepeatBehavior="Forever" />
19           </Storyboard>
20         </BeginStoryboard>
21       </EventTrigger>
22     </Rectangle.Triggers>
23   </Rectangle>
24 </Canvas>

示例解读:

在Canvas下有一个长100px宽100px的的Rectangle对象,在Rectangle的Targegers节点下,定义了一个动画规则,该动画是用来修改Rectangle的透明度(Opacity)属性的,

设置透明度在5秒内按照DoubleAnimation的方式从1.0变化到0.0,且不重复播放。

有了这样的一个例子,我们知道我们要实现Line动态显示效果,就必不可少要用到的对象有Storyboard对象,且要在该对象下制定一个修改X2,Y2的方式(是按照DoubleAnnimation还是ColorAnimation,还是其他方式)

下边我们定一个额Line让他初始化的点在500,500处,当开始启动播放时,从500,500一直画到(200,200)处:

 private void myButton_Click(object sender, RoutedEventArgs e)
        {
            Line myLine = new Line();

            myLine.X1 = 500;
            myLine.Y1 = 500;
            myLine.X2 = 500;
            myLine.Y2 = 500;

            myLine.Stroke = new SolidColorBrush(Color.FromArgb(255, 255, 0, 0));
            myLine.Fill = new SolidColorBrush(Color.FromArgb(255, 255, 0, 0));

            // 把矩形加入到Canvas中
            this.cnsDesignerContainer.Children.Add(myLine);

            // 创建二个double型的动画,并设定播放时间为2秒
            Duration duration = new Duration(TimeSpan.FromSeconds(2));
            DoubleAnimation myDoubleAnimation1 = new DoubleAnimation();
            DoubleAnimation myDoubleAnimation2 = new DoubleAnimation();

            myDoubleAnimation1.Duration = duration;
            myDoubleAnimation2.Duration = duration;

            // 创建故事版,并加入上面的二个double型动画
            Storyboard sb = new Storyboard();
            sb.Duration = duration;

            sb.Children.Add(myDoubleAnimation1);
            sb.Children.Add(myDoubleAnimation2);

            // 设置动画的Target目标值
            Storyboard.SetTarget(myDoubleAnimation1, myLine);
            Storyboard.SetTarget(myDoubleAnimation2, myLine);

            // 设置动画的变化属性
            Storyboard.SetTargetProperty(myDoubleAnimation1, new PropertyPath("(X2)"));
            Storyboard.SetTargetProperty(myDoubleAnimation2, new PropertyPath("(Y2)"));

            myDoubleAnimation1.To = 200;
            myDoubleAnimation2.To = 200;

            if (!cnsDesignerContainer.Resources.Contains("unique_id"))
            {
                // 将动画版加入Canvas资源,注意:这里的unique_id必须是资源中没有的唯一键
                cnsDesignerContainer.Resources.Add("unique_id", sb);
                sb.Completed += new EventHandler(sb_Completed);

                // 播放
                sb.Begin();
            }
            else
            {
                sb = null;
                cnsDesignerContainer.Children.Remove(myLine);
            }
        }

        void sb_Completed(object sender, EventArgs e)
        {
            // 播放完成后,移除资源,否则再次点击时将报错
            cnsDesignerContainer.Resources.Remove("unique_id");
        }

显示的效果正是画线的动画显示方式。

 

 

(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值