用WPF轻松打造iTunes CoverFlow效果

简介: 原文:用WPF轻松打造iTunes CoverFlow效果                                    用WPF轻松打造iTunes CoverFlow效果                                                       周银辉...
原文: 用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);

                }

            }

        }
目录
相关文章
|
C# 开发工具 Windows
WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件
原文 WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件 在 WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit) 一文中,我们说到了在 WPF 中引入简单的 UWP 控件以及相关的注意事项。
1474 0
|
前端开发 UED
[UWP]不那么好用的ContentDialog
原文:[UWP]不那么好用的ContentDialog ContentDialog是UWP开发中最常用的组件之一,一个体验良好的UWP应用很难避免不去使用它。博客园里也有许多的文章介绍如何来利用ContentDialog实现各种自定义样式的弹窗界面。
1338 0
|
C# 程序员
[UWP]做个调皮的BusyIndicator
原文:[UWP]做个调皮的BusyIndicator 1. 前言 最近突然想要个BusyIndicator。做过WPF开发的程序员对BusyIndicator应该不陌生,Extended WPF Toolkit 提供了BusyIndicator的开源实现,Silverlight Toolkit也有一个,这次想要把这个控件移植到UWP中。
932 0
[UWP]了解IValueConverter
原文:[UWP]了解IValueConverter 1. 前言 IValueConverter是用于数据绑定的强大的武器,它用于Value在Binding Source和Binding Target之间的转换。
974 0
[UWP]使用Acrylic(亚克力)
原文:[UWP]使用Acrylic(亚克力) 1. 前言 在 如何使用Fluent Design System 这篇文章里已经简单介绍过Reveal的用法,这篇再详细介绍其它内容。 自Windows 8 放弃Aero后,群众对毛玻璃回归的呼声一致都很大。
1532 0
|
前端开发 JavaScript C#
WPF中使用cefsharp
原文:WPF中使用cefsharp 新入职一家公司,由写服务端接口变成了软硬件通信、服务器、客户端、C/S、B/S乱七八糟各种打杂。
2029 0
|
搜索推荐 API 开发者
简单说一下UWP中的JumpList
原文:简单说一下UWP中的JumpList   在Windows10的10856这个版本中,微软为桌面版提供了一组新的应用交互方式,磁贴和Toast通知的个性化都有了一定的改善。针对磁贴方面,微软为我们提供了一组新的API来扩充我们对应用的交互方式——JumpList。
835 0
|
C#
WPF实现Twitter按钮效果
原文:WPF实现Twitter按钮效果 最近上网看到这个CSS3实现的Twitter按钮,感觉很漂亮,于是想用WPF来实现下. 实现这个效果,参考了CSS3 原文地址:http://www.html5tricks.
1244 0
|
UED 容器
[UWP]了解模板化控件(2.1):理解ContentControl
原文:[UWP]了解模板化控件(2.1):理解ContentControl UWP的UI主要由布局容器和内容控件(ContentControl)组成。布局容器是指Grid、StackPanel等继承自Panel,可以拥有多个子元素的类。
1245 0
|
C# 数据格式 XML
[UWP]了解TypeConverter
原文:[UWP]了解TypeConverter 1. 前言 TypeConverter是XAML解释器的幕后功臣,它做了大量工作,从WPF诞生以来,几乎每一次XAML的运作都有它的参与。虽然UWP中TypeConverter已经彻彻底底退居幕后,连自定义TypeConverver都不可以,但了解TypeConverter的原理对理解XAML解析器的运作方式总是有帮助的。
1385 0