Silverlight & Blend动画设计系列十:Silverlight中的坐标系统(Coordinate System)与向量(Vector)运动

简介: 原文:Silverlight & Blend动画设计系列十:Silverlight中的坐标系统(Coordinate System)与向量(Vector)运动  如果我们习惯于数学坐标系,那么对于Silverlight中的坐标系可能会有些不习惯。
原文: Silverlight & Blend动画设计系列十:Silverlight中的坐标系统(Coordinate System)与向量(Vector)运动

  如果我们习惯于数学坐标系,那么对于Silverlight中的坐标系可能会有些不习惯。因为在Silverlight中的坐标系与Flash中的坐标系一样,一切都的颠倒的。在标准的数学坐标系中,X轴表示水平轴,Y轴表是垂直轴,然而Silverlight中的坐标系是基于视频屏幕的坐标系。

 

  Silverlight中的坐标系统和Flash中的坐标系统是完全一样的,都是采用笛卡尔坐标系统,分为四象限。简单的说就是以X轴表示水平方向并向东方无限延伸,Y轴表示垂直方向并向着南方无限延伸,X和Y轴相交点表示坐标系源点,其X,Y坐标值为0,0,所以在Silverlight中的坐标系范围就是以坐标源点为起点,无限向东南方向延伸,也就是笛卡尔坐标系中的四象限。

        

 

  Silverlight的向量(Vector)运动目前仅支持一维向量运动(One-dimensional vector movement)和二维向量运动(Two-dimensional vector movement),也就是平时大家所说的1D和2D。一维向量运动可以理解为在同一直线上的运动,二维向量运动则可以理解在平面空间(X,Y坐标系)里的运动。向量的概念从初中就开始学习,这里就不做介绍了,如有不清楚的朋友可以移步到这里

 

   二维向量运动很容易理解,在Silverlight的动画设计中二维动画也是最常见和使用率最高的动画,可参考在本系列第一篇《Silverlight & Blend动画设计系列一:偏移动画(TranslateTransform)》中所介绍到的偏移动画变换的实现,其实质就是一个二维向量运动,动画元素对象在动画过度期间不停的改变对象所在的物理坐标位置实现了对象位置的变化,本质上就是元素对象在坐标系里的二维坐标位置的改变。从几何上来理解就是发生了一个二维的向量运动,Silverlight中命名为动画。

        

 

///   <summary>
///  创建动画
///   </summary>
private   void  CreateStoryboard()
{
    
// 元素当前所在的坐标点
    Point currentPoint  =   new  Point(Canvas.GetLeft(darkMoon), Canvas.GetTop(darkMoon));
    
// 目标点坐int标
    Point point  =   new  Point( 280 - 245 );
    
// 创建动画容器时间线
    Storyboard storyboard  =   new  Storyboard();

    DoubleAnimation doubleAnimation 
=   new  DoubleAnimation();

    
// 创建X轴方向动画
    doubleAnimation.From  =  currentPoint.X;
    doubleAnimation.To 
=  point.X;
    doubleAnimation.Duration 
=   new  Duration( new  TimeSpan( 0 0 1 ));
    Storyboard.SetTarget(doubleAnimation, darkMoon);
    Storyboard.SetTargetProperty(doubleAnimation, 
        
new  PropertyPath( " (UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X) " ));
    storyboard.Children.Add(doubleAnimation);

    
// 创建Y轴方向动画
    doubleAnimation  =   new  DoubleAnimation();
    doubleAnimation.SetValue(DoubleAnimation.FromProperty, currentPoint.Y);
    doubleAnimation.SetValue(DoubleAnimation.ToProperty, point.Y);
    doubleAnimation.SetValue(DoubleAnimation.DurationProperty, 
new  Duration( new  TimeSpan( 0 0 1 )));
    Storyboard.SetTarget(doubleAnimation, darkMoon);
    Storyboard.SetTargetProperty(doubleAnimation, 
        
new  PropertyPath( " (UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y) " ));
    storyboard.Children.Add(doubleAnimation);

    storyboard.Begin();
}

 

   下面再来一起学习一个稍微复杂点的二维向量运动,模拟屏幕内有一小球,当鼠标在舞台上点击则小球以动画的形式移动到鼠标点击处。如下XAML定义:

< UserControl  x:Class ="SLV.MainPage"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d
="http://schemas.microsoft.com/expression/blend/2008"  
    xmlns:mc
="http://schemas.openxmlformats.org/markup-compatibility/2006"  
    mc:Ignorable
="d" >
  
< Canvas  x:Name ="LayoutRoot"  Width ="400"  Height ="400"  Background ="Black"  MouseLeftButtonDown ="OnMouseDown" >
        
< Ellipse  Fill ="YellowGreen"  x:Name ="ellipse"  
                 Width
="20"  
                 Height
="20"  
                 Canvas.Left
="80"  
                 Canvas.Top
="66"   >
        
</ Ellipse >
  
</ Canvas >
</ UserControl >

 

  其舞台的鼠标左键点击事件代码如下:

private   void  OnMouseDown( object  sender, System.Windows.Input.MouseButtonEventArgs e)
{
    //鼠标点击点坐标
    var mousePoint 
=  e.GetPosition(null);
    //当前对象所在坐标
    var currentPoint 
=   new  Point(( double )ellipse.GetValue(Canvas.LeftProperty), ( double )ellipse.GetValue(Canvas.TopProperty));

    Storyboard sb 
=   new  Storyboard();
    //创建X坐标方向动画
    DoubleAnimation doubleAnimation 
=   new  DoubleAnimation();
    doubleAnimation.From 
=  currentPoint.X;
    doubleAnimation.To 
=  mousePoint.X;
    doubleAnimation.Duration 
=   new  Duration( new  TimeSpan( 0 0 2 ));
    Storyboard.SetTarget(doubleAnimation, ellipse);
    Storyboard.SetTargetProperty(doubleAnimation, 
new  PropertyPath( " (Canvas.Left) " ));

    sb.Children.Add(doubleAnimation);
    //创建Y坐标方向动画
    doubleAnimation 
=   new  DoubleAnimation();
    doubleAnimation.From 
=  currentPoint.Y;
    doubleAnimation.To 
=  mousePoint.Y;
    doubleAnimation.Duration 
=   new  Duration( new  TimeSpan( 0 0 2 ));
    Storyboard.SetTarget(doubleAnimation, ellipse);
    Storyboard.SetTargetProperty(doubleAnimation, 
new  PropertyPath( " (Canvas.Top) " ));
    sb.Children.Add(doubleAnimation);

    sb.Begin();
}

 

  以上太阳的简单位置变换移动和小球随鼠标的移动都可以理解为平面中向量的运动,只不过在实现上没有直接通过向量的变换实现,而是通过Silverlight中提供的动画API实现,个人认为,从某种角度可以将Silverlight中的动画API理解为Silverlight的向量API,动画API实现的平面动画理解为向量运动。

 

推荐资源:

  MSDN:http://msdn.microsoft.com/zh-cn/library/cc189090(VS.95).aspx

  http://www.silverlight.net/learn/quickstarts/animations/

     Silverlight & Blend动画设计系列文章

  《Function Silverlight 3 Animation》----本篇中使用的部分素材选自此书

目录
相关文章
|
7月前
|
弹性计算 关系型数据库 OLAP
AnalyticDB PostgreSQL版向量索引查询
本案例对比了传统查询和使用向量索引执行查询的执行时间,助您体验使用向量索引查询带来的高效和快捷。
775 0
|
7月前
|
存储 算法 OLAP
ChatGPT都推荐的向量数据库,不仅仅是向量索引
本文带大家一起了解阿里云 AnalyticDB 技术负责人姚奕玮在 QCon 全球软件开发大会(北京站)2023 上的精彩演讲,解密 AnalyticDB 全自研企业级向量数据库核心技术,以及新一代向量数据库在云原生存算分离和 AI 原生上的技术演进路线。
|
7月前
|
存储 算法 OLAP
ChatGPT都推荐的向量数据库,不仅仅是向量索引
在AIGC时代下不少人理解向量数据库就是在传统数据库之上新增一个向量索引,然而随着大模型应用逐渐拓展到核心业务领域,通过复杂代码工程来拼接大模型、向量索引和结构化数据分析结果会阻碍规模化复制。同时并发查询性能、数据一致性、高可靠和弹性伸缩等特性会变得越发重要。阿里云AnalyticDB锚点未来5年企业数据架构智能化升级需求,全自研了企业级向量数据库,它也是国内云厂商中唯一被ChatGPT和LangChain推荐的向量引擎。本文给大家分享QCon 2023的精彩演讲,解密AnalyticDB全自研企业级向量数据库核心技术,以及新一代向量数据库在云原生存算分离和AI原生上的技术演进路线。
|
容器
Silverlight & Blend动画设计系列二:旋转动画(RotateTransform)
原文:Silverlight & Blend动画设计系列二:旋转动画(RotateTransform)   Silverlight的基础动画包括偏移、旋转、缩放、倾斜和翻转动画,这些基础动画毫无疑问是在Silverlight中使用得最多的动画效果,其使用也是非常简单的。
965 0
|
容器 数据可视化 内存技术
Silverlight & Blend动画设计系列一:偏移动画(TranslateTransform)
原文:Silverlight & Blend动画设计系列一:偏移动画(TranslateTransform)   用户界面组件、图像元素和多媒体功能可以让我们的界面生动活泼,除此之外,Silverlight还具备动画功能,它可以让应用程序“动起来”。
794 0
Silverlight & Blend动画设计系列三:缩放动画(ScaleTransform)
原文:Silverlight & Blend动画设计系列三:缩放动画(ScaleTransform)   在Silverlight的动画框架中,ScaleTransform类提供了在二维空间中的坐标内进行缩放操作,通过ScaleTransform可以在水平或垂直方向的缩放和拉伸对象,以实现一个简单的缩放动画效果,故此我将其称为缩放动画(ScaleTransform)。
887 0
Silverlight & Blend动画设计系列四:倾斜动画(SkewTransform)
原文:Silverlight & Blend动画设计系列四:倾斜动画(SkewTransform)   Silverlight中的倾斜变化动画(SkewTransform)能够实现对象元素的水平、垂直方向的倾斜变化动画效果。
795 0
|
容器
Silverlight & Blend动画设计系列五:故事板(StoryBoards)和动画(Animations)
原文:Silverlight & Blend动画设计系列五:故事板(StoryBoards)和动画(Animations)   正如你所看到的,Blend是一个非常强大的节约时间的设计工具,在Blend下能够设计出很多满意的动画作品,或许他具体是怎么实现的,通过什么方式实现的我们还是一无所知。
911 0