通通玩blend美工(5)——旋转木马,交互性设计
这一篇偏向于逻辑的比较多,放在这个系列里会不会欠妥呢?在中国交互性设计也是美工的份内职责哦~
所以没有blend基础的人也可以看懂这篇文章,不过要用到初中的几何知识哦~亲
相信很多人都在手机或者网页上或者KTV的点歌系统里看到过旋转木马的目录导航,这个是如何做的呢??
最终效果如下:(貌似有点太大了显示不下,附加个阅览地址:
http://space.silverlightchina.net/ltt147/TTcarousel/Default.html)
改变左上角的数据,会有意想不到的效果哟~
(特别鸣谢烤地瓜的答疑,和地瓜村众人的热心帮助)
1.总体思路
分析上面效果:一排方块在转圈,点击的块跑到最近的位置
圈:其实就是一个椭圆,只不过人的近大远小的逻辑思维,大脑根据常识把它装换成了一个空间。
最近的位置:其实就是椭圆的最下面,块变得最大,所以感觉最近。
2.设计过程
首先我们来实现让这堆块围绕成一个椭圆。
step.1 椭圆是这样来产生滴~!↓
我以我微薄的几何知识用blend画出了上图,右上角看到我们久违的椭圆公式。第一个公式当把y单独提到等号一边时发现是要开根号的这样,就如图所看到的,一个x对应着两个y值还得去判断正负号显得麻烦了,就用第二个公式吧。其中a为x半轴,b为y半轴,d为角度。只需要一个角度d就可以确定出这个椭圆中的所有点了。
首先写出变换块位置的方法:
private void SetPosition(Grid item, double degree) { TransformGroup myTG = item.RenderTransform as TransformGroup; TranslateTransform myTT = myTG.Children[0] as TranslateTransform;//位置变换 myTT.X = a * Math.Cos(degree);//计算x坐标 myTT.Y = b * Math.Sin(degree);//计算y坐标 item.Tag = degree; ScaleTransform myST = myTG.Children[1] as ScaleTransform;//大小变换 myST.ScaleX = myST.ScaleY = (1 - scale) / b * myTT.Y + scale; Canvas.SetZIndex(item, (int)(myTT.Y + 2 * b));//层次变换为Y轴的位置 }
step.2 跟随鼠转标起来吧
这样传入需要变换的块和事先计算的该块的位置所在就角度就可以确定该块的位置、大小、层次了。单mousemove的时候,只要给每一个块都重新定位,把鼠标的移动距离装换为块组需要旋转的角度。
private void LayoutRoot_MouseMove(object sender, MouseEventArgs e)//鼠标移动时转动{if (isPress)//如果当前为按住鼠标的状态{foreach (Grid item in LayoutRoot.Children)//遍历所有的Grid{SetPosition(item, (double)item.Tag + (startPoint.X - e.GetPosition(this).X) * 0.005);//变换位置}startPoint.X = e.GetPosition(this).X;//把但前位置赋给开始位置}}
我把每个Grid的Tag用来存储自己当前所在的角度。
step.3 点击就转到前面来啊,亲~
接下来制作点击块转动的动画,即点击块后更具该块所在的位置,计算出旋转到90'时需要旋转的角度,然后所有块都转这个角度(为什么是90°呢?应该是270°啊~因为wpf中的位移动画,Y轴移动向下是为正,向上为负,这样就刚好和我们课堂上通用的坐标系刚好上下翻转了)
void newGrid_MouseUp(object sender, MouseButtonEventArgs e)//单击其中一块转正{double nowAngle = (double)((sender as Grid).Tag);//根据当前的块的角度double needAngle = Math.PI / 2 - nowAngle % (Math.PI * 2);//换算出把改块转正整体需要转动的角度foreach (Grid item in LayoutRoot.Children)//为每一个块都添加动画{degree = (double)item.Tag;//获取各个块的角度TransformGroup myTG = item.RenderTransform as TransformGroup; TranslateTransform myTT = myTG.Children[0] as TranslateTransform;//位置变换Storyboard sb = new Storyboard(); sb.Duration = new Duration(TimeSpan.FromMilliseconds(Duration));DoubleAnimation xAnimation = new DoubleAnimation();xAnimation.To = a * Math.Cos(degree + needAngle);//计算x坐标xAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(Duration));sb.Children.Add(xAnimation);Storyboard.SetTarget(xAnimation, myTT);Storyboard.SetTargetProperty(xAnimation, new PropertyPath("X"));DoubleAnimation yAnimation = new DoubleAnimation();yAnimation.To = b * Math.Sin(degree + needAngle);//计算x坐标yAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(Duration)); sb.Children.Add(yAnimation); Storyboard.SetTarget(yAnimation, myTT);Storyboard.SetTargetProperty(yAnimation, new PropertyPath("Y"));ScaleTransform myST = myTG.Children[1] as ScaleTransform;//大小变换DoubleAnimation xScaleAnimation = new DoubleAnimation();DoubleAnimation yScaleAnimation = new DoubleAnimation();xScaleAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(Duration));yScaleAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(Duration));if (LayoutRoot.Children.IndexOf(item) == 0)//只添加一次动画完成后遍历控件改变位置{yScaleAnimation.Completed += new EventHandler((s, events) =>//动画结束后把整体的位置调整为动画结束时的位置{foreach (Grid item1 in LayoutRoot.Children){SetPosition(item1, (double)item1.Tag);}});}yScaleAnimation.To = xScaleAnimation.To = (1 - scale) / b * yAnimation.To + scale;sb.Children.Add(xScaleAnimation); Storyboard.SetTarget(xScaleAnimation, myST); Storyboard.SetTargetProperty(xScaleAnimation, new PropertyPath("ScaleX")); sb.Children.Add(yScaleAnimation);Storyboard.SetTarget(yScaleAnimation, myST);Storyboard.SetTargetProperty(yScaleAnimation, new PropertyPath("ScaleY"));sb.Begin();//开始动画item.Tag = degree + needAngle;//记录最后的角度}}
step.4 最靠近下面的要自动对正哦~
OK,接下来还差最有一点就是自动对正了,即当拖动时把最接近最近位置的块自定定位到最近。
原理就是遍历所有块的但前位置,角度越接近90°的就模拟一下它的单击
private void LayoutRoot_MouseUp(object sender, MouseButtonEventArgs e)//当鼠标弹起时判断最近的块,自动转正{double minNear = 100;Grid nearGrid = null;foreach (Grid item in LayoutRoot.Children)//找出最近的Grid{double near = Math.Abs(Math.PI / 2 - (double)item.Tag % (Math.PI * 2));if (near < minNear){minNear = near;nearGrid = item;}}newGrid_MouseUp(nearGrid, null);//模拟最近的块被点了一次isPress = false;}
做完收工。
下面是我修改左上角的参数实现的几个比较好看的效果
效率也是很不错的,上面的100个块在我i7的电脑上一点都不卡哦。
大家如果调出什么好看的效果可以贴到回复里,交流下。
我把核心代码都讲了遍,如果还是有不懂的,可以给我留言。当然了这个silverlight版只是作为演示用得第一版,有很多细节方面我没处理。至于源码,因为我做的这个原版是WPF程序作为商用,所以经过多番考虑我还是不公布源码了。当然了我是不会告诉你可以反编译.xap来获取源码的。
原文地址:通通玩blend美工(5)——旋转木马,交互性设计
跑运输论坛,跑跑运输,搞活经济!!! (还等什么!!!赶快猛点进入!!!) 跑运输站长博客,跑运输,搞活经济!!! (还等什么!!!赶快猛点进入!!!)
聚划算淘宝客外推精选商品、 集结聚划算外推高转化商品 品牌卖家折扣商品推广 天天疯狂购,低至3折,还等 神马 打造第一母婴达人馆,网罗更多母婴商品,为你打造属于你的温馨小屋! 淘宝优秀店铺精选,集合了高佣金高转换率的优秀店铺。 秒杀满立减 齐集淘宝疯狂促销食品、让你买得省心、吃得放心、而且还有高额佣金哦! 淘宝皇冠店铺精选,集合了高佣金高转换率的皇冠 店铺。 淘宝网-亚洲最大、最安全的网上交易平台,提供机票、票务服务,方便您的出行 想看宝岛台湾的时尚动态吗,想观宝岛台湾的潮流前沿吗,一切尽在台湾馆频道,高佣金、高转化,精彩不容错过 淘宝最权威的女装风向标,集合了淘宝最热卖的优质商品,给买家带来全新的购物体验。 淘宝商城,亚洲最大最全最专业的网上购物网站——淘宝网打造的在线B2C购物平台。 淘宝商城频道集合了全球最知名的品牌包括联想、惠普、迪士尼、Kappa、乐扣乐扣、JackJones等,给买家带来全新的一站式购物体验 正品行货保证!精选电器城最优品牌商品,让您有亲临商城的优良购物体验。 引领淘宝数码时尚,为你带来淘宝最受追捧的新潮数码产品,让你追随时尚永不out! 淘宝最权威的鞋包配饰风向标,集合了淘宝最热卖的优质商品,让买家了解每季最时尚的配饰。 淘宝客男人频道,精选淘宝网热销男装,高成交、高佣金、高转化,让您收益节节高! 集结淘宝最丰富的强势类目,精选最优质的卖家和商品,达到最广泛的买家覆盖率 淘宝美容馆,我的美容管家。精选商品、高额佣金、疯狂畅销、打造买家自己的美容小馆。 打造第一居家达人馆,网罗更多创意极品和居家商品,为你共同打造属于你的浪漫满屋!
网购从这里开始
通通玩blend美工(5)——旋转木马,交互性设计相关推荐
- 通通玩blend美工(6)下——仿iPhone滚动选择器的ListBox(交互逻辑)
原文:通通玩blend美工(6)下--仿iPhone滚动选择器的ListBox(交互逻辑) 上一篇我们已经把界面画出来了,这篇我们就来制作交互的逻辑吧.上一篇的电梯: http://www.cnblo ...
- 通通玩blend美工(8)——动态绘制路径动画,画出个萌妹子~
通通玩blend美工(8)--动态绘制路径动画,画出个萌妹子~ 原文:通通玩blend美工(8)--动态绘制路径动画,画出个萌妹子~ 2年前我在玩Flex的时候就一直有一个疑问,就是如何来实现一个蚊香 ...
- 教你玩转HTML(html5)h5网页设计,网站开发-刘青-专题视频课程
教你玩转HTML(html5)h5网页设计,网站开发-54965人已学习 课程介绍 教你玩转HTML(html5)h5网页设计,网站开 课程收益 教你玩转HTML(html5) ...
- 自己做量化交易软件(15)通通量化AI框架的选股器设计1
自己做量化交易软件(15)通通量化AI框架的选股器设计 前面我们学会了单只股票的分析,回测功能.下面我们开始设计选股器和量化分析的功能. 在设计选股器之前,我们先要学习一些python基本操作技巧. ...
- 关于软件的交互性设计
如何使软件不在是被人操作的工具,他也可以像你的朋友一样和你自如的沟通.这已不仅仅是易用性的问题.也不仅仅客户需求的问题,而实实在在的设计问题 ,交互性是设计出来的,为用户工作目标和快乐使用而设计,通过 ...
- 人们为什么玩游戏———节选自《游戏设计原理与实践》
人们为什么玩游戏 我们应该思考一个问题是,为什么人们要玩游戏?为什么愿意打电脑玩Doom游戏,而不是去参加博物馆或者去看场电影?相对与人类对其他娱乐的追求,电脑游戏的独特之处在哪里?游戏提供了哪些其他 ...
- 电商美工必看|Banner设计没灵感?传说中大气的画册风格给你灵感
Banner设计没灵感?不知道如何进行文字排版和配色,才能让店铺和产品更有吸引力-- 集设网 www.ijishe.com 设计师交流社区带来系列画册风格的banner设计,以简洁优雅的画册风格描述画 ...
- javascript交互性设计
JavaScript是有助于向网页添加交互性的编程语言.例如,你可以使用 JavaScript 来定义用户选择按钮时将发生的行为:例如打开一个弹出窗口. 使用 JavaScript无需重载即可从网页添 ...
- c语言设计篮球计分器软件,会玩篮球更会玩篮球赛计时计分器,完整设计资料开源...
介绍一种篮球赛计时计分器的设计方法,即单片机带外围扩展来驱动数码管工作的电路.电路采用单片机作为核心元件,利用两个供阴的三位一体数码管来显示两队的分数,一个四位一体数码管显示时间的计时.显示分数范围可 ...
最新文章
- 机器学习一 -- 什么是监督学习和无监督学习?
- MS CRM 2011 RC中的新特性(2)——销售自动化方面
- linux下nginx启动停止重启控制脚本
- 【TensorFlow-windows】学习笔记一——基础理解
- IntelliJ IDEA for Mac 文件结构侧边窗口/类文件内部结构(File Structure)
- c++ cdi+示例_C ++“和”关键字示例
- 【python教程入门学习】Python 正则表达式
- 用easyx画五角星_【洛谷日报#195】有个东西叫EasyX
- c语言学习-使用指针对三个变量互相赋值
- 一路风景---我期待的是师生关系
- 其他进制转化为十进制 详解
- 一个简单进程池的实现
- jQuery菜鸟教程
- canvas将两张图片合并成一张图片并下载
- 实现Ubuntu与Windows之间的复制粘贴
- @Enumerated的使用
- 读《如何有效阅读一本书:超实用笔记读书法》
- 面向对象三大特性(继承)
- 软件的第三方CNAS测试的目的和意义以及测试内容和流程
- springboot整合redis后整合es,报错Failed to instantiate [org.elasticsearch.client.transport.TransportClient]