在Silverlight的动画框架中,ScaleTransform类提供了在二维空间中的坐标内进行缩放操作,通过ScaleTransform可以在水平或垂直方向的缩放和拉伸对象,以实现一个简单的缩放动画效果,故此我将其称为缩放动画(ScaleTransform)。使用ScaleTransform需要特别关注的有两点:中心点坐标X、Y轴方向的缩放比例,比例值越小则对象元素就越小(既收缩),比例值越大则对象元素就越大(既呈现为放大效果)。

        

        

  Blend对Silverlight里的动画设计支持非常强大,同偏移动画、旋转动画一样简单,要实现缩放动画也只需要对设计好的动画元素进行简单的设计就能完成动画效果的创建。

        

  通过创建动画容器时间线后,如上图进行动画效果属性的设置,Blend便会生成相应的动画编码在XAML文件里,详见如下代码块:


<Storyboard x:Name="Storyboard1">    
     <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="truck"          
      Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)">         
        <EasingDoubleKeyFrame KeyTime="00:00:03" Value="0.15"/>     
    </DoubleAnimationUsingKeyFrames>     
    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="truck"          
      Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)">         
      <EasingDoubleKeyFrame KeyTime="00:00:03" Value="0.15"/>     
    </DoubleAnimationUsingKeyFrames>
</Storyboard>

       

  任何一个元素对象,其缩放动画(ScaleTransform)的默认值为(1,1),既保持元素原样不变。如前面所说,比例值越小则对象元素就越小(既收缩),比例值越大则对象元素就越大(既呈现为放大效果)。如上示例就是将缩放比例值设置的0.15,其运行效果如下图所示:

      

  如果上图动画效果使用程序编码去实现,同样的也是很简单的,主要就是利用动画根据时间去控制对象的ScaleTransform变换效果的ScaleX和ScaleY值,详细如下:

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->

/// <summary> /// 创建对象truck的缩放动画,3秒钟从原始大小缩放到15%的大小

/// </summary>

     public void CreateStoryboard()

    {

      //创建动画容器时间线     Storyboard storyboard = new Storyboard();

     //创建X轴方向的缩放动画,设置对象缩放到0.15,置对象缩放缓存时间为3秒     DoubleAnimation doubleAnimation = new DoubleAnimation();

    doubleAnimation.To = 0.15;     doubleAnimation.Duration = new Duration(new TimeSpan(0, 0, 3));

    Storyboard.SetTarget(doubleAnimation, truck);     Storyboard.SetTargetProperty(doubleAnimation,         new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"));

     storyboard.Children.Add(doubleAnimation);

  如上示例,如果将移动的对象换成一个“车”,执行动画的时候就感觉是一辆车在马路上行驶了。缩放动画(ScaleTransform)在平时的开发中非常适用,不如界面上有一个组件,默认为缩放一半显示,当用户的鼠标指向它的时候将对象放大到正常比例(x,y=>1,1)显示,鼠标离开的时候将对象恢复到默认大小(x,y=>0.5,0.5),此时就可以使用缩放动画(ScaleTransform)去实现。


<Ellipse Width="50" Height="50" Fill="Red" x:Name="ellipse" RenderTransformOrigin="0.5,0.5">   
    <Ellipse.RenderTransform>         
      <TransformGroup>             
        <ScaleTransform ScaleX="0.5" ScaleY="0.5"/>             
          <SkewTransform/>             
            <RotateTransform/>             
        <TranslateTransform/>         
      </TransformGroup>     
    </Ellipse.RenderTransform>
</Ellipse>
  ellipse.MouseEnter += (mes, mee) =>    
{        
    Storyboard storyboard = new Storyboard();        
    DoubleAnimation doubleAnimation = new DoubleAnimation();        
    doubleAnimation.To = 1;        
    doubleAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(300));        
    Storyboard.SetTarget(doubleAnimation, ellipse);        
    Storyboard.SetTargetProperty(doubleAnimation,            
    new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"));        
    storyboard.Children.Add(doubleAnimation);
       doubleAnimation = new DoubleAnimation();        
     doubleAnimation.To = 1;        
    doubleAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(300));        
    Storyboard.SetTarget(doubleAnimation, ellipse);        
    Storyboard.SetTargetProperty(doubleAnimation,             new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)"));        
    storyboard.Children.Add(doubleAnimation);
       storyboard.Begin();    
};
ellipse.MouseLeave += (mls, mle) =>    
{        
    Storyboard storyboard = new Storyboard();        
    DoubleAnimation doubleAnimation = new DoubleAnimation();        
    doubleAnimation.To = 0.5;        
    doubleAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(300));        
    Storyboard.SetTarget(doubleAnimation, ellipse);        
    Storyboard.SetTargetProperty(doubleAnimation,             new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"));        
    storyboard.Children.Add(doubleAnimation);
        doubleAnimation = new DoubleAnimation();         doubleAnimation.To = 0.5;        
    doubleAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(300));        
    Storyboard.SetTarget(doubleAnimation, ellipse);        
    Storyboard.SetTargetProperty(doubleAnimation,             new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)"));        
    storyboard.Children.Add(doubleAnimation);
       storyboard.Begin();    
};
 

//创建Y轴方向的缩放动画,设置对象缩放到0.15,置对象缩放缓存时间为3秒

   doubleAnimation = new DoubleAnimation();

  doubleAnimation.SetValue(DoubleAnimation.ToProperty, 0.15);

  doubleAnimation.SetValue(DoubleAnimation.DurationProperty, new Duration(new TimeSpan(0, 0, 3)));

   Storyboard.SetTarget(doubleAnimation, truck);

  Storyboard.SetTargetProperty(doubleAnimation,         new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)"));

   storyboard.Children.Add(doubleAnimation);

storyboard.Begin();

}

  PS:上面代码块仅是为了掩饰缩放动画(ScaleTransform)的使用,如果真要实现圆形对象的鼠标指向放大,移开恢复原状的效果只需要直接设置其宽度(Width)和高度(Height)属性就可以了。

        

最新文章

  1. form表单验证-Javascript
  2. 利用chrome插件批量读取浏览器页面内容并写入数据库
  3. vsftpd增加ssl安全验证
  4. linux下安装jira详细步骤
  5. ACM——数的计数
  6. 数据库元数据分析Demo
  7. bug调试大全
  8. js 计算两个日期之间的月数
  9. 【线段树求最靠前】【HDU2795】【Billboard】
  10. IIS 部署WCF服务注意事项
  11. 【python进阶】深入理解系统进程2
  12. CReLU激活函数
  13. 小白的python之路11/3内存 进程 二进制软件包 rpm yum
  14. dom 及bom
  15. Exploit-Exercises nebule 旅行日志(四)
  16. Redis之主从复制
  17. JustOj 2009: P1016 (dp)
  18. Yii验证码简单使用及
  19. DevExpress使用方法GridControl总结
  20. 8I - 吃糖果

热门文章

  1. Zynq_soc学习
  2. 《maven实战》笔记(5)----maven的版本
  3. Objective-C中的一些方法命名“潜规则”
  4. amm与tmpfs和swap
  5. Vs code调试Dart语言
  6. js取url问号后的参数方法封装
  7. xdebug调试的原理
  8. &lt;marquee&gt;滚动文字&lt;/marquee&gt;
  9. 分布式消息通信之RabbitMQ_02
  10. 在先电IAAS平台中,搭建先电bigdata平台