用WPF轻松打造iTunes CoverFlow效果

                                    用WPF轻松打造iTunes CoverFlow效果
                                                       周银辉

先Show一下:
CoverFlow1.png
CoverFlow2.png

下面这一张是苹果的iTunes软件:
iTunes.png

苹果iTunes播放器的CoverFlow效果羡煞旁人,不过有了WPF,我们也可以轻松实现哈,今天费了半天的时间终于搞定,呵呵...

感兴趣的话可以这里下载源代码
(说明:上传源代码时由于图片较大,所以就没传图片了,程序取的是用户" 我的图片"文件夹下的*.jpg图片,你可以修改代码中的路径或在"我的图片"文件夹下放几张jpg图片就可以看到效果了)

图片是使用3DTools 提供的2D到3D映射的方式贴图上去的,每张图片都帖在一个3D模型上,我们只需要让程序来安排这些模型的摆放位置就可以了

3D模型的摆放是按照如下方法进行的,其中3个传出参数angle指定模型源Y轴的旋转角度,offsetX指定模型的X轴方向上的平移量,offsetZ指定模型在Z轴方向上的平移量

 /// <summary>
        
/// 依照InteractiveVisual3D在列表中的序号来变换其位置等
        
/// </summary>
        
/// <param name="index">在列表中的序号</param>
        
/// <param name="midIndex">列表中被作为中间项的序号</param>

        private void GetTransformOfInteractiveVisual3D(int index, double midIndex, out double angle, out double offsetX, out double offsetZ)
        
{
            
double disToMidIndex = index - midIndex;


            
//旋转,两翼的图片各旋转一定的度数
            angle = 0;
            
if (disToMidIndex < 0)
            
{
                angle 
= this.ModelAngle;//左边的旋转N度
            }

            
else if (disToMidIndex > 0)
            
{
                angle 
= (-this.ModelAngle);//右边的旋转-N度
            }

            
         

            
//平移,两翼的图片逐渐向X轴负和正两个方向展开
            offsetX = 0;//中间的不平移
            if (Math.Abs(disToMidIndex) <= 1)
            
{
                offsetX 
= disToMidIndex * this.MidModelDistance;
            }

            
else if (disToMidIndex != 0)
            
{
                offsetX 
= disToMidIndex * this.XDistanceBetweenModels + (disToMidIndex > 0 ? this.MidModelDistance : -this.MidModelDistance);
            }

            

            
//两翼的图片逐渐向Z轴负方向移动一点,造成中间突出(离观众较近的效果)
            offsetZ = Math.Abs(disToMidIndex) * -this.ZDistanceBetweenModels;
          
        }

点击图片或指定当前应该被突出显示的图片时的动画效果是这样实现的,先使用上面的方法计算出决定模型位置的几个便量的新值(即上面的几个传出参数),然后在使用动画(DoubleAnimation)让这几个值由旧值过度到新值.
  /// <summary>
        
/// 重新布局3D内容
        
/// </summary>

        private void ReLayoutInteractiveVisual3D()
        
{
            
int j=0;
            
for (int i = 0; i < this.viewport3D.Children.Count; i++)
            
{
                InteractiveVisual3D iv3d 
=  this.viewport3D.Children[i] as InteractiveVisual3D;
                
if(iv3d != null)
                
{
                    
double angle = 0;
                    
double offsetX = 0;
                    
double offsetZ = 0;
                    
this.GetTransformOfInteractiveVisual3D(j++this.CurrentMidIndex,out angle,out offsetX,out offsetZ);


                    NameScope.SetNameScope(
thisnew NameScope());
                    
this.RegisterName("iv3d", iv3d);
                    Duration time 
= new Duration(TimeSpan.FromSeconds(0.3));

                    DoubleAnimation angleAnimation 
= new DoubleAnimation(angle, time);
                    DoubleAnimation xAnimation 
= new DoubleAnimation(offsetX, time);
                    DoubleAnimation zAnimation 
= new DoubleAnimation(offsetZ, time);

                    Storyboard story 
= new Storyboard();
                    story.Children.Add(angleAnimation);
                    story.Children.Add(xAnimation);
                    story.Children.Add(zAnimation);

                    Storyboard.SetTargetName(angleAnimation, 
"iv3d");
                    Storyboard.SetTargetName(xAnimation, 
"iv3d");
                    Storyboard.SetTargetName(zAnimation, 
"iv3d");

                    Storyboard.SetTargetProperty(
                        angleAnimation,
                        
new PropertyPath("(ModelVisual3D.Transform).(Transform3DGroup.Children)[0].(RotateTransform3D.Rotation).(AxisAngleRotation3D.Angle)"));

                    Storyboard.SetTargetProperty(
                        xAnimation,
                        
new PropertyPath("(ModelVisual3D.Transform).(Transform3DGroup.Children)[1].(TranslateTransform3D.OffsetX)"));
                    Storyboard.SetTargetProperty(
                        zAnimation,
                        
new PropertyPath("(ModelVisual3D.Transform).(Transform3DGroup.Children)[1].(TranslateTransform3D.OffsetZ)"));

                    story.Begin(
this);

                }

            }

        }

posted on 2007-09-27 16:36 周银辉 阅读(5496) 评论(40)  编辑 收藏 网摘 所属分类: WPF

评论

#1楼 2007-09-27 17:12 111111111111111111[未注册用户]

太漂亮了!!!   回复  引用    

#2楼 2007-09-27 17:32 巫云      

机器档次不够啊,用不起啊。   回复  引用  查看    

#3楼 2007-09-27 18:28 Allen Lee      

有趣!   回复  引用  查看    

#4楼 2007-09-27 20:15 scotoma      

确实非常的漂亮哦.下载下来试试嘿嘿   回复  引用  查看    

#5楼 2007-09-27 20:30 ddddddd[未注册用户]

好文,好技术.   回复  引用    

#6楼 2007-09-27 21:45 w[未注册用户]

不错,好东东   回复  引用    

#7楼 2007-09-27 23:17 live live live die die die [未注册用户]

转载请注明出处   回复  引用    

#8楼 2007-09-28 00:25 我爱车讯网[未注册用户]

支持ingl...   回复  引用    

#9楼[楼主] 2007-09-28 09:05 周银辉      

@live live live die die die
老大,这是我自己打造的,网上也有这么一个,但它是不开源的,看清楚了再说,谢谢
  回复  引用  查看    

#10楼 2007-09-28 09:23 装配脑袋      

为什么都喜欢用RAR呢,解不开啊~~~
Windows本身以及多种免费软件就能够解开的Zip多好
  回复  引用  查看    

#11楼[楼主] 2007-09-28 09:25 周银辉      

@装配脑袋
所以说习惯是很可怕的哈:)
  回复  引用  查看    

#12楼 2007-09-28 09:31 装配脑袋      

@周银辉
那就拜托帮我转一下下啦^_^
  回复  引用  查看    

#13楼 2007-09-28 09:32 我爱车讯网-全国最大的汽车资讯--香车美女展示[未注册用户]

是啊~习惯成自然~   回复  引用    

#14楼 2007-09-28 09:32 我爱车讯网-全国最大的汽车资讯--香车美女展示[未注册用户]

因为人都有惰性~   回复  引用    

#15楼 2007-09-28 10:02 sddn[未注册用户]

可能我的图片多了点,一运行内存就暴涨到1.33G,拖慢了别的程序响应,真是跑不起。   回复  引用    

#16楼 2007-09-28 10:07 daizhj      

一个字, 强!!!   回复  引用  查看    

#17楼[楼主] 2007-09-28 10:11 周银辉      

@sddn
这是WPF的Image控件在作怪,我发现WPF读取较大的图片(比如一张2M的照片)时很费劲,我也正为这事烦恼,使用该DEMO时请不要使用太多的较大的图片
  回复  引用  查看    

#18楼 2007-09-28 10:46 xiao_p      

lz。我用vs 2008 打不开工程,请问是什么原因呢?   回复  引用  查看    

#19楼 2007-09-28 10:47 xiao_p      

vs 2008 不支持这种项目类型,这不就是wpf的项目吗? 为什么不支持呢?   回复  引用  查看    

#20楼[楼主] 2007-09-28 10:52 周银辉      

@xiao_p
我没有试过,但应该可以吧,高版本的VS会转换低版本的项目,请确认你已转换了
  回复  引用  查看    

#21楼 2007-09-28 11:02 xiao_p      

没有提示转换,而是直接弹出个对话框,说该项目不被支持,我郁闷了。
ps:项目是用vs 2005写的吗? 我过去倒是安装了wpf extention 。不过 后来 安装了vs2008 ,就给删除掉了,会不会是因为这样的原因呢?
  回复  引用  查看    

#22楼[楼主] 2007-09-28 11:05 周银辉      

@xiao_p
也许吧,你可以换一台电脑试试,我这里都安装的是VS2005,不能帮你试了,不好意思
  回复  引用  查看    

#23楼 2007-09-28 11:06 xiao_p      

恩,好,已经很感谢了!
  回复  引用  查看    

#24楼 2007-09-28 11:17 programdev[未注册用户]

效果很不错   回复  引用    

#25楼 2007-09-28 17:20 w[未注册用户]

是挺不错   回复  引用    

#26楼 2007-09-28 17:20 w[未注册用户]

哈哈!   回复  引用    

#27楼 2007-10-10 16:07 王兴 wx[未注册用户]

过度不够平滑,加入一些光影效果会好些,现在感觉比较生硬,反映迟钝些   回复  引用    

#28楼 2007-10-11 09:22 111111111111111111[未注册用户]

@王兴 wx
这样的程序对机器配置还是有一定要求的
  回复  引用    

#29楼 2007-12-10 17:47 morph[未注册用户]

Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CoverFlowDemo", "CoverFlowDemo\CoverFlowDemo.csproj", "{5C9CAF06-FA36-4ED8-8319-F409F1822A67}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{5C9CAF06-FA36-4ED8-8319-F409F1822A67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5C9CAF06-FA36-4ED8-8319-F409F1822A67}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5C9CAF06-FA36-4ED8-8319-F409F1822A67}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5C9CAF06-FA36-4ED8-8319-F409F1822A67}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal




用wpf打开后显示的页面
  回复  引用    

#30楼[楼主] 2007-12-10 17:51 周银辉      

@morph
你那是解决方案文件包含的内容吧(用记事本打开后可以看到)
不懂你所说的"用wpf打开后显示的页面 "的意思???
  回复  引用  查看    

#31楼 2007-12-13 20:54 yellowyu      

太漂亮了,很不错,以前在05做这么类似的做法快花了一星期吧!!想问一下,咱们可以用08,或者其他生成,然后给VS05用吗

可以的话,大概怎么用,请说个思路,或者给个链接,谢谢!
  回复  引用  查看    

#32楼[楼主] 2007-12-14 17:13 周银辉      

@yellowyu
你是说解决方案吗? VS的项目或解决方案,可以由低版本升级到高版本,但反过来不行
  回复  引用  查看    

#33楼 2008-05-03 23:36 江千帆[未注册用户]

模仿楼主,我也做了一个CoverFlow,用HitTest实现了3D交互,采用了复杂的3D模型,加入了一些方便用户的功能。
东西放在我的博客上了,点我的名字应该能连接过去。

感觉WPF还是有很多潜力可以挖掘,有空一起研究研究:)
  回复  引用    

#34楼[楼主] 2008-05-04 18:36 周银辉      

@江千帆
谢谢留言,看到了,很不错:)
  回复  引用  查看    

#35楼 2008-05-12 16:01 Miss Zhang [未注册用户]

您好,可以帮我一个忙吗?可以帮我写一个在VS 2005或vs 2008里用WPF/E项目模板生成一个含有动画效果的项目或应用程序的过程吗?只要3000字过程就可以了,或许要在什么条件你才可以帮我,可以Email我。   回复  引用    

#36楼[楼主] 2008-05-12 21:31 周银辉      

@ Miss Zhang
您好,很抱歉的是,由于目前我的时间比较紧张并且对您要求的项目相关知识也还不太熟悉,所以很抱歉,暂时不能为您提供帮助,非常感谢您的来信,谢谢
  回复  引用  查看    

#37楼 2008-08-21 13:50 JasonGuo[未注册用户]

楼主你好

图片可以换成类似PANEL的控件吗?

里面我可以放一些textbox之类的,增加用户体验!

谢谢~~
  回复  引用    

#38楼 2008-09-10 09:18 奇怪的jane[未注册用户]

--引用--------------------------------------------------
装配脑袋: 为什么都喜欢用RAR呢,解不开啊~~~
<br>Windows本身以及多种免费软件就能够解开的Zip多好
--------------------------------------------------------
解开rar包是免费的,压缩是收费的
  回复  引用    

#39楼 2009-03-31 13:50 Cat Chen      

你的Coverflow没做Cover的倒影哦~我现在需要一个自动生成倒影的方法。   回复  引用  查看    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 908213




相关文章:

相关链接:

导航

<2007年9月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

统计

搜索

 

常用链接

留言簿

我参与的团队

随笔分类(215)

随笔档案(195)

友情链接

积分与排名

最新随笔

阅读排行榜