Silverlight学习笔记(十一)-----类似 MacDock 的 SilverlightDock 小项目

  直奔主题,要模拟MacDock的效果,主要是通过silverlight对图片进行动画的缩放。在对图片一些处理效果有了一定了解的基础上就可以进行模拟。

 

这就是类似MacDock的效果:(图片已横置)。QQ音乐在线播放器的正下方也实现类似的效果(非GG)  

  
  现总结一下主要的思路:当鼠标移动到每一张图片的时候,图片都会放大,这就是说每一张图片均有自己的MouseMove事件,相互独立。在MouseMove事件中,我们要根据鼠标距离目标item的距离来设定缩放倍数,当鼠标离开之后就要还原图片。


  三个要点:1、如何计算鼠标到目标(图片)中心的距离dis
       2、如何设置放大倍数
       3、页面如何承载

  要点一还是比较简单的,学过几何的都很容易理解,主要是直角三角形的计算。上附图,加段代码。

        


   
  我们很难直接得到鼠标到item中心的距离,但是通过封装好的方法,我们可以轻易得到鼠标到 Item的左上角(top,left)的距离,即有箭头的绿色线的长度。那么通过加减就可以右边的直角三角形的两条直角边,从而得到鼠标到item中心的距离。

代码如下:

 1 //计算鼠标距离 到图片中心的距离 d
2 internal double Distance(MouseEventArgs mouse,DockItem item)

3 {
4 //使用ActualWidth、ActualHeight
5 double x = (item.ActualWidth / 2) - mouse.GetPosition(item).X;

6 double y = (item.ActualHeight / 2) - mouse.GetPosition(item).Y;
7
8 double dis = Math.Sqrt(x * x + y * y);
9 return dis;
10 }

  在这里之所以使用ActualWidth、ActualHeight,而不使用图片的Width、Height,是因为我们并不能保证图片的的形状,若对图片进行一些效果变换,例如扭曲之类的,直接使用图片的Width、Height属性的话,会影响目标图像的缩放效果,在这个小Project中就直接导致一些图片闪烁;使用ActualWidth、ActualHeight会准确地获得对象的实际属性,避免不必要的影响。
  
  要点二:如何设置放大倍数。这个放大倍数肯定有一个上限值,不可能无限放大,而且缩放的倍数与距离dis是函数相关的。那么不妨假设这个倍数函数为 f(d) ,值域为[1,m],定义域为[0,d],并且存在预定感知常量 s 使得 f(s) = 1,表示距离dis 超过 感知长度s ,那么放大的倍数为1,即没有放大。另外当距离dis = 0 时,放大的倍数达到上限 m 倍,即,f(0) = m;
  存在这么一个放大函数:f(d)=zoom;

  

  要点三:页面如何承载。
  3.1、既然每张图片的都是相互独立的,而且有着自己的MouseMove触发事件,那么就单独建立一个silverlight用户控件(DockItem),用来承载每张图片,实现自己的缩放效果。
  3.2、要将所有的图片放在一起,那么必须要存在一个“父容器”(Dock),承载所有的 DockItem 实例,并且在这个“父容器”(Dock)中,实现倒影的效果。

 


  基本就是这些了,水平有限,有不少取巧的地方。例如加载图片资源时。。。曾经尝试通过读取项目当前目录,遍历所有文件来实现的,但是老是出现“用户代码没有实现"SecurityException"”,没能找到如何处理这个SecurityException异常,求指导。


  到目前,silverlight就告一段落了,也算是基本入门了吧。现在算是有了XAML、Silverlight、C#、asp.NET、数据库等语言基础了,准备着手学习WP开发。至于其他像LinQ之类的,还需要用到的知识,边学边用吧。

附:已经把整个Silverlight项目打包上传。http://115.com/file/anjkz7o6#
SilverDock.rar

posted @ 2012-02-23 22:42  Nereus_37  阅读(1866)  评论(0编辑  收藏  举报