图片Silverlight 模拟Nano5 界面效果

nano5  时间:2021-01-13  阅读:()

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

本来是放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)

{

//遍历图片与当前(C U R R E NT)位置关系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/l ibrary/system.windows.media. l ineargradientbrush.aspx

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

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

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

源代码下载:http://cid-c75f4e27adfe5bbc.skydrive. l ive.com/self.aspx/GnieTech/Nano5.zip

美国高防云服务器 1核 1G 10M 38元/月 百纵科技

百纵科技:美国云服务器活动重磅来袭,洛杉矶C3机房 带金盾高防,会员后台可自助管理防火墙,添加黑白名单 CC策略开启低中高.CPU全系列E52680v3 DDR4内存 三星固态盘列阵。另有高防清洗!百纵科技官网:https://www.baizon.cn/联系QQ:3005827206美国洛杉矶 CN2 云服务器CPU内存带宽数据盘防御价格活动活动地址1核1G10M10G10G38/月续费同价点击...

腾讯云轻量服务器两款低价年付套餐 2核4GB内存8M带宽 年74元

昨天,有在"阿里云秋季促销活动 轻量云服务器2G5M配置新购年60元"文章中记录到阿里云轻量服务器2GB内存、5M带宽一年60元的活动,当然这个也是国内机房的。我们很多人都清楚备案是需要接入的,如果我们在其他服务商的域名备案的,那是不能解析的。除非我们不是用来建站,而是用来云端的,是可以用的。这不看到其对手腾讯云也有推出两款轻量服务器活动。其中一款是4GB内存、8M带宽,这个比阿里云还要狠。这个真...

sharktech:洛杉矶/丹佛/荷兰高防服务器;1G独享$70/10G共享$240/10G独享$800

sharktech怎么样?sharktech (鲨鱼机房)是一家成立于 2003 年的知名美国老牌主机商,又称鲨鱼机房或者SK 机房,一直主打高防系列产品,提供独立服务器租用业务和 VPS 主机,自营机房在美国洛杉矶、丹佛、芝加哥和荷兰阿姆斯特丹,所有产品均提供 DDoS 防护。不知道大家是否注意到sharktech的所有服务器的带宽价格全部跳楼跳水,降幅简直不忍直视了,还没有见过这么便宜的独立服...

nano5为你推荐
海外虚拟主机国内访问速度较快的海外虚拟主机有哪些呀网站服务器租用网站的服务器买哪里的最好,还有租用一年大概多少钱???急!!!国内免费空间免费空间哪个好用ip代理地址IP代理什么意思?域名购买如何购买域名?美国服务器托管美国服务器租用时要注意什么?网站空间域名网站空间,域名,操作网站空间价格我想自己弄个小网站,但我不会懂域名和买空间价格,便宜一点的一共要多少钱?韩国虚拟主机大家用的虚拟主机是国内的还是香港的还是韩国的还是美国的安徽虚拟主机有没有免费使用的主机,网站刚做完,本地测试没有问题,想在线测试一下页面会不会跑版。有谁知道有没有免费的虚拟主机试用,两三天即可。
100m虚拟主机 域名转让网 广州主机租用 花生壳免费域名申请 万网免费域名 华为云服务 踢楼 hostgator 香港服务器99idc tier 香港托管 suspended godaddy域名优惠码 2017年万圣节 云鼎网络 商务主机 铁通流量查询 ibox官网 本网站在美国维护 gg广告 更多