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

香港2GB内存DIYVM2核(¥50月)香港沙田CN2云服务器

DiyVM 香港沙田机房,也是采用的CN2优化线路,目前也有入手且在使用中,我个人感觉如果中文业务需要用到的话虽然日本机房也是CN2,但是线路的稳定性不如香港机房,所以我们在这篇文章中亲测看看香港机房,然后对比之前看到的日本机房。香港机房的配置信息。CPU内存 硬盘带宽IP价格购买地址2核2G50G2M1¥50/月选择方案4核4G60G3M1¥100/月选择方案4核8G70G3M4¥200/月选择...

水墨云历史黑名单IDC,斟酌选购

水墨云怎么样?本站黑名单idc,有被删除账号风险,建议转出及数据备份!水墨云ink cloud Service是成立于2017年的商家,自2020起开始从事香港、日本、韩国、美国等地区CN2 GIA线路的虚拟服务器租赁,同时还有台湾、国内nat vps相关业务,也有iplc专线产品,相对来说主打的是大带宽服务器产品。注意:本站黑名单IDC,有被删除账号风险,请尽量避免,如果已经购买建议转出及数据备...

丽萨主机122元/每季,原生IP,CN2 GIA网络

萨主机(lisahost)新上了美国cn2 gia国际精品网络 – 精品线路,支持解锁美区Netflix所有资源,HULU, DISNEY, StartZ, HBO MAX,ESPN, Amazon Prime Video等,同时支持Tiktok。套餐原价基础上加价20元可更换23段美国原生ip。支持Tiktok。成功下单后,在线充值相应差价,提交工单更换美国原生IP。!!!注意是加价20换原生I...

nano5为你推荐
美国虚拟空间美国虚拟主机无限空间是什么意思?域名空间什么是域名,空间?域名服务商最好的域名服务商是哪一家网站空间域名什么是网站域名和网站空间php虚拟空间怎样修改php虚拟空间单个文件上传大小限制成都虚拟空间成都市规划信息技术中心如何?成都虚拟空间五星网络隶属于成都冠一科技有限公司,虚拟空间购买了不到一个月不能访问2次,质量真差啊!网站空间商网站空间商怎么查询万网虚拟主机万网免费虚拟主机和收费虚拟主机有什么区别1g虚拟主机网站空间1G是多少M,网站空间用1G虚拟主机够吗。价格多少,数据库和网站有什么关系
猫咪永久域名收藏地址 江西服务器租用 naning9韩国官网 flashfxp怎么用 vpsio 网络星期一 好看的桌面背景图 申请个人网站 七夕促销 新家坡 135邮箱 nerds web服务器安全 安徽双线服务器 web服务器搭建 监控服务器 中国联通宽带测速 xshell5注册码 香港博客 windows2008 更多