前一阵无意中发现将iPod Nano5 横置后会出现一个动态的选歌界面(如下图示),感觉不错于是想用Silverlight来实现一下这个效果,欢迎大家拍砖。

本来是放Demo演示,可是这个程序怎么也显示不出来,只好用图片了(感兴趣的话可以下载源代码):

在制作过程中比较繁琐的部分是倒影效果,最开始的做法是将同一张专辑图片使用两次:一个作为专辑封面;一个作为倒影效果。对倒影效果图片进行RenderTransform->ScaleY 反转和OpacityMask->LinearGradientBrush 渐变处理,这样操作后出现一个问题:未选中专辑的封面和倒影之间有间隙(如下图示)。这是由于分别对封面和倒影进行PlaneProjection->RotationY 三维旋转时会使它们按各自的坐标轴进行旋转,不是以一个整体进行旋转而差生了偏差。如果将两个图片组合为一个StackPanel 或Canvas 然后再进行旋转感觉应该可以(但需要不少代码实现,效率可能会降低,感兴趣的朋友可以测试一下),最后偷懒用PS 给图片做了倒影~

下面先来看看XAML,这部分就是为Canvas 增加一些事件:

<Canvas x:Name="LayoutRoot" MouseLeftButtonDown="LayoutRoot_MouseLeftButtonDown">
</Canvas>

C# 内容请看注释详解:

public partial class MainPage : UserControl
{private String[] ALBUMS = { "images/ep1.png", "images/ep2.png", "images/ep3.png", "images/ep4.png", "images/ep5.png", "images/ep6.png", "images/ep7.png", "images/ep8.png", "images/ep9.png" };//当前位置private double CURRENT = 0;//目标位置private double TARGET = 0;//存储图片private List<Image> IMAGE = new List<Image>();//计时器private DispatcherTimer TIMER = new DispatcherTimer();public MainPage(){InitializeComponent();//加载图片addImages();//对于不同浏览器加载滚轮事件HtmlPage.Window.AttachEvent("DOMMouseScroll", LayoutRoot_MouseWheel);HtmlPage.Window.AttachEvent("onmousewheel", LayoutRoot_MouseWheel);HtmlPage.Document.AttachEvent("onmousewheel", LayoutRoot_MouseWheel);}private void addImages(){for (int i = 0; i < ALBUMS.Length; i++){//逐一加载图片string url = ALBUMS[i];Image cover = new Image();cover.Source = new BitmapImage(new Uri(url, UriKind.Relative));LayoutRoot.Children.Add(cover);//调整图片显示方式setImage(cover, i);//将图片加入IMAGE,用于实现动态效果IMAGE.Add(cover);}}private void setImage(Image image, int index){//遍历图片与当前(CURRENT)位置关系double offset = index - CURRENT;//对图片进行三维旋转PlaneProjection planeProjection = new PlaneProjection();planeProjection.RotationY = Math.Abs(offset) * 65 / (offset != 0 ? offset : 1);image.Projection = planeProjection;double left;double top = 50;double center = Width / 2 - 100;double scale = 1;if (index == CURRENT){left = center;top = 40;scale = 1.15;}else if (index > CURRENT){left = center + offset * 50 + 60;}else{left = center + offset * 50 - 40;}//对CURRENT图片进行缩放ScaleTransform scaleTransform = new ScaleTransform();scaleTransform.ScaleX = scale;scaleTransform.ScaleY = scale;image.RenderTransform = scaleTransform;//调整遍历图片位置image.SetValue(Canvas.LeftProperty, left);image.SetValue(Canvas.TopProperty, top);image.SetValue(Canvas.ZIndexProperty, (int)(-Math.Abs(offset)) * 100);}//点击鼠标左键正向移动图片private void LayoutRoot_MouseLeftButtonDown(object sender, MouseButtonEventArgs e){moveIndex(1);}/** 如果将下面事件加入Canvas的MouseWheel="LayoutRoot_MouseWheel"(XAML)中,* 页面加载后初始不能获取滚轮事件。*///private void LayoutRoot_MouseWheel(object sender, MouseWheelEventArgs e)//{//    double mouseDelta = 0;//    mouseDelta = Math.Sign(e.Delta);//    moveIndex((mouseDelta > 0) ? 1 : -1);//}//通过HtmlPage加载鼠标滚动事件,详情可参考资料<4>private void LayoutRoot_MouseWheel(object sender, HtmlEventArgs args){double mouseDelta = 0;ScriptObject e = args.EventObject;// Mozilla and Safari    if (e.GetProperty("detail") != null){mouseDelta = ((double)e.GetProperty("detail"));}// IE and Opera   else if (e.GetProperty("wheelDelta") != null)mouseDelta = ((double)e.GetProperty("wheelDelta"));mouseDelta = Math.Sign(mouseDelta);moveIndex((mouseDelta > 0) ? 1 : -1);}private void moveIndex(int value){//获取目标图片位置,并确保其在图片数量范围内TARGET += value;TARGET = Math.Max(0, TARGET);TARGET = Math.Min(IMAGE.Count - 1, TARGET);}//计时器Tick,移动到目标图片private void timerTick(object sender, EventArgs e){for (int i = 0; i < IMAGE.Count; i++){Image image = IMAGE[i];setImage(image, i);}CURRENT = TARGET;}//启动计时器public void startShow(){TIMER = new DispatcherTimer();TIMER.Interval = new TimeSpan(0, 0, 0, 0, 10);TIMER.Tick += new EventHandler(timerTick);TIMER.Start();}
}

至此,Nano5 的界面效果已完成,借此作品献给已世的 * MJ * 。

相关参考资料:

1. LinearGradientBrush类 
    http://msdn.microsoft.com/zh-cn/library/system.windows.media.lineargradientbrush.aspx

2. 三维效果(透视转换) 
    http://msdn.microsoft.com/zh-cn/library/dd470131(VS.95).aspx

3. DispatcherTimer 类 
    http://msdn.microsoft.com/zh-cn/library/system.windows.threading.dispatchertimer(VS.95).aspx

4. How to Capture the Mouse Wheel Event 
    http://blogs.silverlight.net/blogs/msnow/archive/2008/07/29/tip-of-the-day-23-how-to-capture-the-mouse-wheel-event.aspx

源代码下载:

本文转自Gnie博客园博客,原文链接:http://www.cnblogs.com/gnielee/archive/2010/02/21/silverlight-nano5.html,如需转载请自行联系原作者

Silverlight 模拟Nano5 界面效果相关推荐

  1. silverlight实现图片局部放大效果

    2019独角兽企业重金招聘Python工程师标准>>> silverlight实现图片局部放大效果方法之一: 可以使用两幅图片,一幅图片是显示待放大的图片,另一幅图片是原图,这里,他 ...

  2. 使用WPF技术模拟手机界面

    1. 前言 WPF(Windows Presentation Foundation),即"Windows呈现基础",它的目的非常明确,就是用来把数据"显示"给用 ...

  3. 大疆睿炽Tello EDU无人机python操控之三——使用easyGUI模拟操控界面控制Tello EDU

    使用easyGUI模拟操控界面控制Tello EDU 说到easyGUI这个模块,大家应该都不陌生了,模块名中有个"easy",是的,这代表它用起来很简单:这个模块就是一个能够轻易 ...

  4. JavaScript的案例:模拟聊天界面发送信息

    JavaScript的案例:模拟聊天界面发送信息 这是我第一次写博客,也是一位刚入门的前端菜鸟!希望大家多多帮助与支持! 1.如图所示:点击下面头像即可切换用户,这也是我和我女朋友用的第一个情侣头像, ...

  5. python端午dragboat消消乐 美轮美奂的界面效果

    python端午,dragboat消消乐 美轮美奂的界面效果 1. 效果图 2. 源码 2.1 素材准备源码(消消乐图.bg音乐) 2.2 消消乐源码 参考 跟着大佬的步伐,消消乐俩步走~~ 找素材, ...

  6. JQuery EasyUi之界面设计——前言与界面效果(一)

    为什么80%的码农都做不了架构师?>>>    如果冯巩的开场白是"观众朋友们,我想死你们了",那么我的开场白是"最近一直很忙,很久没有发文了" ...

  7. xpath技术解析xml以及案例模拟用户登录效果

    问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!!! xpath就在此情况下产生了--主要是用于快速获取所需的[节点对象]. 在dom4j中如何使用xPath技术 1) ...

  8. JS模拟模式窗口效果

    <html> <head>     <meta http-equiv="Content-Type" content="text/html; ...

  9. jquery 背景特效实现_html5实现的仿网页版微信聊天界面效果源码

    码农那点事儿 关注我们,一起学习进步 这是一款基于html5实现的仿网页版微信聊天界面效果源码,可实现微信网页版聊天界面效果,在编辑框编辑文字之后按Ctrl+Enter键即可提交文字到聊天对话框上.整 ...

最新文章

  1. 红帽技术开放日:参与开源社区不只有贡献代码这一种方式
  2. 我在学习技术的过程遇到的不会的单词(不断完善)
  3. PWN-PRACTICE-BUUCTF-19
  4. CPU各寄存器的作用
  5. python 遍历文件夹 文件
  6. 你的公司有如下的症状吗?
  7. Mysql索引查询失效的情况
  8. 使用Nexus在Windows中搭建Maven私服
  9. cacti mysql 压缩 备份_CactiEZ备份和恢复
  10. celeste第二章_蔚蓝全剧情全流程攻略 全关卡详解图文攻略
  11. Office之word如何把尾注的上标加括号,尾注里的上标改为普通数字
  12. 动态Web-JSP和tomcat
  13. 2020产品经理升职攻略-直播分享课
  14. 八边形类 Octagon
  15. 第3-5课:24 点计算器
  16. android代码实现手机加速功能,神奇的安卓手机提速方法 只需设置两步立即提速70%以上...
  17. Linux 的信号量
  18. Hikvison对接iSecure Center时获取Appkey和Secert、不显示API网关、预览时提示网络请求失败
  19. JDK8报错:warning: ignoring option PermSize=256m; support was removed in 8.0【多测师_王sir】【杭州多测师_王sir】...
  20. Bloom filters in Python

热门文章

  1. T-SQL select语句连接两个表
  2. asp.net 2.0
  3. Linux下Nodejs安装
  4. SCALA环境搭建(2)_scala源文件编写和运行---大数据之_SCALA工作笔记005
  5. Sharding-JDBC(实现读写分离)_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记014
  6. 大数据_Hbase-API访问_Java操作Hbase_数据操作_命名空间创建_表创建_表查询---Hbase工作笔记0013
  7. 自己关于pytorch transfomers 的一个误区
  8. mac xcode c++ cin cout注意细节一
  9. java拓扑圆形布局算法
  10. 源数据怎么排查重复MySQL_面试官:在使用mysql数据库时,遇到重复数据怎么处理?...