图片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

GigsGigsCloud 春节优惠2022 指定云服务器VPS主机85折循环优惠码

GigsGigsCloud商家在之前介绍的还是比较多的,因为之前我一直有几台机器在使用,只是最近几年网站都陆续转型删除掉不少的网站和闲置域名,包括今年也都减少网站开始转型自媒体方向。GigsGigsCloud 商家产品还是比较有特色的,有提供香港、新加坡等亚洲机房的云服务器、VPS和独立服务器等。第一、新春优惠活动优惠码:CNY2022-15OFF截止到正月初二,我们可以使用上述优惠码在购买指定G...

华纳云CN2高防1810M带宽独享,三网直cn218元/月,2M带宽;独服/高防6折购

华纳云怎么样?华纳云是香港老牌的IDC服务商,成立于2015年,主要提供中国香港/美国节点的服务器及网络安全产品、比如,香港服务器、香港云服务器、香港高防服务器、香港高防IP、美国云服务器、机柜出租以及云虚拟主机等。以极速 BGP 冗余网络、CN2 GIA 回国专线以及多年技能经验,帮助全球数十万家企业实现业务转型攀升。华纳云针对618返场活动,华纳云推出一系列热销产品活动,香港云服务器低至3折,...

hostkvm:美国VPS,三网强制CU-VIP线路,$5/月,1G内存/1核/15gSSD/500g流量

hostkvm在2021年3月新上线洛杉矶新VPS业务,强制三网接入中国联通优化线路,是当前中美之间性价比最高、最火热的线路之一,性价比高、速度非常好,接近联通AS9929和电信AS4809的效果,带宽充裕,晚高峰也不爆炸。 官方网站:https://hostkvm.com 全场优惠码:2021(全场通用八折,终身码,长期) 美国 US-Plan0【三网联通优化线路】 内存:1G CPU:...

nano5为你推荐
网站空间租赁网站空间租用好一些还是云主机好一些?域名代理怎么通过域名赚钱域名注册服务万网域名注册服务怎么样?网站服务器租用哪些网站适合独立服务器租用?价格方面怎么样?ip代理地址代理ip地址是怎么来的?免费网站空间免费个人网站 空间美国网站空间美国,韩国,香港网站空间asp网站空间说ASP空间是做网站的空间是啥意思?北京网站空间一个小型企业网站空间和网站域名一年需要多少钱?万网虚拟主机万网免费虚拟主机和收费虚拟主机有什么区别
台湾主机 域名中介 zpanel softbank官网 外国域名 鲜果阅读 evssl证书 mysql主机 彩虹ip web服务器架设 789电视 699美元 国外代理服务器软件 qq云端 vip购优惠 爱奇艺vip免费领取 上海联通宽带测速 宏讯 中国电信测速器 百度云加速 更多