通通玩blend美工(5)——旋转木马,交互性设计

简介: 原文:通通玩blend美工(5)——旋转木马,交互性设计      这一篇偏向于逻辑的比较多,放在这个系列里会不会欠妥呢?在中国交互性设计也是美工的份内职责哦~   所以没有blend基础的人也可以看懂这篇文章,不过要用到初中的几何知识哦~亲     相信很多人都在手机或者网页上或者K...
原文: 通通玩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来获取源码的。

  

目录
相关文章
|
2月前
|
编解码 前端开发 JavaScript
|
4月前
|
图形学
如何在微信小游戏制作工具中做出好看的粒子效果?
如何在微信小游戏制作工具中做出好看的粒子效果?
43 1
|
4月前
|
机器学习/深度学习 算法 图形学
Unity小游戏——无限滚动的背景的改良
Unity小游戏——无限滚动的背景的改良
|
11月前
|
图形学
如何做出好看的粒子效果
嗨!大家好,我是小蚂蚁。 微信小游戏制作工具提供了简单的粒子插件,使用起来简单明了(如果你用过Unity的粒子组件就知道这个有多简单明了了),虽然功能相对简单,可设置的属性也有限,但是我们仍然能够用它在游戏中做出漂亮的效果。 比如说在彩虹星球大冒险中,所有的爆炸都是使用的粒子效果来实现的。
97 0
|
前端开发 容器
暗夜发光,独自闪耀,盘点网页暗黑模式(DarkMode)下的特效和动效,CSS3实现
众所周知,网页的暗黑模式可以减少屏幕反射和蓝光辐射,减少眼睛的疲劳感,特别是在夜间使用时更为明显。其实暗黑模式也给霓虹灯效应(Neon Effect)提供了发挥的环境。 霓虹灯效应是一种视觉效果,其特点是在深色背景上使用鲜艳的颜色来产生强烈的视觉冲击。这种效应通常用于设计海报、广告、标志和网页等。霓虹灯效应的作用在于吸引人们的注意力和增强品牌形象的辨识度,因为这种效果让人印象深刻且易于记忆,本次我们盘点适合暗色模式的网页特效,还是喜欢,暗夜的你。
暗夜发光,独自闪耀,盘点网页暗黑模式(DarkMode)下的特效和动效,CSS3实现
|
JavaScript 前端开发
精致动画特效及源代码
精致动画 css,js动画效果 放大镜 云彩动画效果 手风琴效果 3D旋转切换 照片墙 翻书特效 图片悬停特效 图片飞入特效 hover特效
精致动画特效及源代码
|
Web App开发 前端开发 JavaScript
Amazing!巧用 CSS 视差实现酷炫交互动效
Amazing!巧用 CSS 视差实现酷炫交互动效
201 0
Amazing!巧用 CSS 视差实现酷炫交互动效
|
JavaScript 前端开发
9套迷人精致的CSS3 3D按钮动画
9套迷人精致的CSS3 3D按钮动画
294 0
|
前端开发 Web App开发 JavaScript
如何创作用纯 CSS 绘制一支栩栩如生的铅笔
效果预览 在线演示 按下右侧的“点击预览”按钮可以在当前页面预览,点击链接可以全屏预览。 https://codepen.io/comehope/pen/PaZYBw 可交互视频教程 此视频是可以交互的,你可以随时暂停视频,编辑视频中的代码。
948 0
|
开发框架 测试技术 C#
通通玩blend美工(7)——简约而不简单的块
原文:通通玩blend美工(7)——简约而不简单的块       最近在研发一个WPF快速开发框架,满脑子都是各种逻辑各种模式,写一篇比较休闲娱乐的博客,宣泄下我对美工的热爱。   我一直以来有意无意在手机应用或者各种网站上看到这么一种风格按钮,明明很简单,却有一种很清新感觉。
955 0

热门文章

最新文章