一步一步学Silverlight 2系列(30):使用Transform实现更炫的效果(下)

概述

Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython,对JSON、Web Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlight 2系列》文章将从Silverlight 2基础知识、数据与通信、自定义控件、动画、图形图像等几个方面带您快速进入Silverlight 2开发。

本文为使用Transform实现更炫的效果第二部分,在Silverlight中提供了四种基本变换:旋转变换(RotateTransform )、缩放变换(ScaleTransform)、倾斜变换(SkewTransform)、移动变换(TranslateTransform)和两种复杂的变换:变换组(TransformGroup)、矩阵变换(MatrixTransform ),这些变换可以运用到任何控件或者图形图像。

矩阵变换(MatrixTransform )

矩阵变换MatrixTransform是所有变换中功能最强大最灵活也是最复杂的一种变换,如果前面讲解的几种基本变化不能满足我们在实际开发中的需求,可以使用矩阵变换进行自定义,它允许我们直接对变换矩阵进行操作。

在Silverlight中,变换是提供一个3*3的矩阵,我们通过修改矩阵中成员的值来实现变换,矩阵的定义如下所示:

TerryLee_Silverlight2_0148

如修改OffsetX,元素将会在X轴上进行移动;修改OffsetY,元素将在Y轴上移动;修改M22为2,元素的高度将会拉伸2倍,通过该矩阵,我们能实现前面提到的几种基本变换的所有功能。更详细的解释大家可以参考SDK。如下面的例子,我们使用矩阵变换,仍然能实现前面示例中的变换效果:

<Canvas Background="#CDFCAE">
    <Image Source="a1.png" Canvas.Left="120" Canvas.Top="50" Opacity="0.3">
    </Image>
    <Image Source="a1.png" Canvas.Left="120" Canvas.Top="50" Opacity="0.5">
        <Image.RenderTransform>
            <MatrixTransform>
                <MatrixTransform.Matrix>
                    <Matrix OffsetX="0" OffsetY="0" M12="0.2"></Matrix>
                </MatrixTransform.Matrix>
            </MatrixTransform>
        </Image.RenderTransform>
    </Image>
    
    <Image Source="a1.png" Canvas.Left="120" Canvas.Top="50">
        <Image.RenderTransform>
            <MatrixTransform>
                <MatrixTransform.Matrix>
                    <Matrix OffsetX="0" OffsetY="0" M12="0.4"></Matrix>
                </MatrixTransform.Matrix>
            </MatrixTransform>
        </Image.RenderTransform>
    </Image>
</Canvas>

运行后效果如下:

TerryLee_Silverlight2_0149  

实现动画变换

Transform与Silverlight中的Storyboard结合,可以很容易的实现出动画变换的效果,如下面的例子,当鼠标放在上去的时候,图片开始旋转;鼠标离开时停止旋转:

<Canvas Background="#CDFCAE">
    <Canvas.Resources>
        <Storyboard x:Name="myStoryboard">
            <DoubleAnimation
          Storyboard.TargetName="myTransform"
          Storyboard.TargetProperty="Angle"
          From="0" To="180" Duration="0:0:5" RepeatBehavior="Forever" />
        </Storyboard>
    </Canvas.Resources>
    <Image x:Name="imgTarget" Source="a1.png" Canvas.Left="180" Canvas.Top="80"
           MouseEnter="imgTarget_MouseEnter" MouseLeave="imgTarget_MouseLeave">
        <Image.RenderTransform>
            <RotateTransform x:Name="myTransform" Angle="15" CenterX="120" CenterY="68" />
        </Image.RenderTransform>
    </Image>
</Canvas>

在代码中控制Storyboard:

private void imgTarget_MouseEnter(object sender, MouseEventArgs e)
{
    myStoryboard.Begin();
}

private void imgTarget_MouseLeave(object sender, MouseEventArgs e)
{
    myStoryboard.Stop();
}

运行后效果如下:

TerryLee_Silverlight2_0150

当鼠标放上后将开始旋转:

TerryLee_Silverlight2_0151 

用代码控制变换

这个话题其实没什么好讲的,在后台代码中对Transform进行控制,如下面的例子,每次点击图片时,都让RotateTransform的角度增加15度:

<Canvas Background="#CDFCAE">
    <Image Source="a1.png" Canvas.Left="180" Canvas.Top="80" Opacity="0.3">
    </Image>
    <Image x:Name="imgTarget" Source="a1.png" Canvas.Left="180" Canvas.Top="80"
           MouseLeftButtonDown="imgTarget_MouseLeftButtonDown">
        <Image.RenderTransform>
            <RotateTransform x:Name="myTransform" Angle="0" CenterX="120" CenterY="68" />
        </Image.RenderTransform>
    </Image>
</Canvas>

后台代码:

private void imgTarget_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    myTransform.Angle = myTransform.Angle + 15;
}

运行后起始界面如下:

TerryLee_Silverlight2_0152

当单击之后将会旋转:

TerryLee_Silverlight2_0153 

结束语

本文为使用Transform实现更炫的效果第二部分,介绍了矩阵变换以及如何实现动画变换、在代码中控制变换,接下来我将会运用前面几篇关于图形图像处理的知识写一个综合实例。

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Tag标签: Silverlight
posted @ 2008-03-19 19:00 TerryLee 阅读(9288) 评论(45)  编辑 收藏 网摘 所属分类: [03]  银光点亮世界

  回复  引用  查看    
#1楼[楼主]2008-03-19 19:05 | TerryLee      
放在一篇文章中,感觉太长了,就分成了两部分来写:)
  回复  引用  查看    
#2楼2008-03-19 19:22 | jillzhang      
这个太强大了,一定要学习
  回复  引用  查看    
#3楼[楼主]2008-03-19 19:23 | TerryLee      
@jillzhang
是的,Transform确实很好很强大,呵呵:)

  回复  引用  查看    
#4楼2008-03-19 19:54 | KevinLi      
用他来做计算机教育课件,说不定能拿个奥斯卡奖呢 :)
  回复  引用    
#5楼2008-03-19 19:57 | pitfull[未注册用户]
谢谢博主的系列文章,受益匪浅,这是Silverlight2最好的教程了。不知道能否提供系列文档下载收藏呢?
  回复  引用  查看    
#6楼[楼主]2008-03-19 20:15 | TerryLee      
@KevinLi
不知道有奥斯卡这个奖项中有没有计算机教育课件这么一项,呵呵:)

  回复  引用  查看    
#7楼[楼主]2008-03-19 20:16 | TerryLee      
@pitfull
我使用Live Writer写的,暂时没有整理出来,等这个系列完成了也许会提供PDF版本下载

  回复  引用  查看    
#8楼2008-03-19 20:16 | 生鱼片      
支持
这个系列可以找出版社出本书了,TerryLee 效率够高.
  回复  引用  查看    
#10楼[楼主]2008-03-19 21:21 | TerryLee      
@自由、创新、研究、探索……
谢谢shanyou的支持:)

  回复  引用  查看    
#11楼[楼主]2008-03-19 21:21 | TerryLee      
@生鱼片
谢谢:)

  回复  引用    
#12楼2008-03-19 22:30 | 菜鸟1只[未注册用户]
看了这么眩的效果 一定跟着老大学习。。。。
  回复  引用  查看    
#13楼[楼主]2008-03-19 23:04 | TerryLee      
@菜鸟1只
:)

  回复  引用  查看    
#14楼2008-03-20 01:37 | yzlhccdec      
明明用Blend就好了,为什么要用VS写?LZ不是用VS写的吧?
  回复  引用    
#15楼2008-03-20 01:48 | pitfull[未注册用户]
--引用--------------------------------------------------
TerryLee: @pitfull
我使用Live Writer写的,暂时没有整理出来,等这个系列完成了也许会提供PDF版本下载
--------------------------------------------------------

那就先谢谢了,真是造福大众啊!

  回复  引用  查看    
#16楼[楼主]2008-03-20 09:08 | TerryLee      
@yzlhccdec
用Blend是很容易实现,但是作为开发人员应该了解基本的XAML,我是用VS写的

// 这跟在VS里面做ASP.NET开发一样的,不是说我们直接拖几个控件就可以,而不用去了解那些控件有什么属性等。。。

  回复  引用  查看    
#17楼[楼主]2008-03-20 09:08 | TerryLee      
@pitfull
:)

  回复  引用  查看    
#18楼2008-03-20 09:47 | yzlhccdec      
@TerryLee
你说的没错,但我觉得更好的办法是UI和Coding完全分开,呵呵。反正本来就可以分开做的。
你加油,我把手头工作忙完了就跟进你的系列。不过我觉得如果你可以辅以Blend做教学效果会更好。

  回复  引用  查看    
#19楼[楼主]2008-03-20 10:47 | TerryLee      
@yzlhccdec
嗯,等把这些东西讲完了,我想专门写一个Blend的教程,呵呵:)

  回复  引用  查看    
#20楼2008-03-20 12:31 | 狼Robot      
期待楼主的PDF.呵呵.
  回复  引用  查看    
#21楼[楼主]2008-03-20 12:55 | TerryLee      
@狼Robot
尽量吧,先把这个系列写好:)

  回复  引用    
#22楼2008-03-20 13:37 | songsgroup[未注册用户]
希望有socket,media播放这些方面的资料,谢谢了。很厉害。
  回复  引用  查看    
#23楼[楼主]2008-03-20 13:43 | TerryLee      
@songsgroup
视频后面会写到,关于socket目前资料实在太少了,不知道从哪儿写起,呵呵

  回复  引用    
#24楼2008-03-20 15:13 | zyz[未注册用户]
大虾可不可以做个这个系列的索引呢?
  回复  引用    
#25楼2008-03-20 15:16 | zyz[未注册用户]
@TerryLee
抱歉,刚看到博客左侧的 快捷通道 :)

谢谢博主的分享,继续学习~~

  回复  引用    
#26楼2008-03-20 16:09 | finesite[未注册用户]
@TerryLee
玩笑归玩笑,用在课件设计上应该很不错吧?

  回复  引用  查看    
#27楼[楼主]2008-03-20 18:22 | TerryLee      
@zyz
其实很早就做了索引了:)

  回复  引用  查看    
#28楼[楼主]2008-03-20 18:22 | TerryLee      
@finesite
我觉的用在课件设计上,似乎有点大材小用了,呵呵

  回复  引用    
#29楼2008-03-21 16:33 | niube' son[未注册用户]
看了搂住的介绍,说实在,这些东西真没十么好学的. 一点技术含量也没有.

你看看创建这些东西, 除了写一些XML,其他还有啥? 学这些东西,真还不如学photoshop好一点。



  回复  引用  查看    
#30楼[楼主]2008-03-21 22:21 | TerryLee      
@niube' son
唉,我已经在上篇文章下回复过了,针对这种言论,不想再发表一遍了,既然认为Photoshop比Silverlight好,那就去学Photoshop吧,我们也不必再讨论了。。。

  回复  引用  查看    
#31楼2008-03-26 10:11 | zero.one      
请问TerryLee,编译的时候出以下错误是怎么回事

错误 1 未知的生成错误“引发类型为“System.OutOfMemoryException”的异常。” my.Picture
错误 2 “ResourcesGenerator”任务意外失败。
System.OutOfMemoryException: 引发类型为“System.OutOfMemoryException”的异常。
在 System.IO.MemoryStream.set_Capacity(Int32 value)
在 System.IO.MemoryStream.EnsureCapacity(Int32 value)
在 System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count)
在 System.IO.BinaryWriter.Write(Byte[] buffer, Int32 index, Int32 count)
在 System.Resources.ResourceWriter.WriteValue(ResourceTypeCode typeCode, Object value, BinaryWriter writer, IFormatter objFormatter)
在 System.Resources.ResourceWriter.Generate()
在 System.Resources.ResourceWriter.Dispose(Boolean disposing)
在 Microsoft.Build.Tasks.Windows.ResourcesGenerator.Execute()
在 Microsoft.Build.BuildEngine.TaskEngine.ExecuteInstantiatedTask(EngineProxy engineProxy, ItemBucket bucket, TaskExecutionMode howToExecuteTask, ITask task, Boolean& taskResult) my.Picture

  回复  引用    
#32楼2008-03-28 10:38 | lenco[未注册用户]
你这个只是当touch the event 时 才有动画
能无限循环或对keytime进行设置 等等
introduce

  回复  引用  查看    
#33楼2008-06-17 13:20 | kkun      
如何做平移操作呀?从一个点动画移动到另外一个点?
  回复  引用  查看    
#34楼[楼主]2008-06-18 00:43 | TerryLee      
@kkun
参考本系列第二十九篇,有一个移动变换。

  回复  引用  查看    
#35楼2008-06-23 18:08 | NMeteor      
學到這裡了劃個記號先,感恩李老師。
  回复  引用    
#36楼2008-11-11 14:53 | crosssky[未注册用户]
真是不错的教程 。非常感谢楼主为大家提供这么好的东西。
  回复  引用  查看    
#37楼[楼主]2008-11-12 11:13 | TerryLee      
@crosssky
呵呵,太客气了:)

  回复  引用  查看    
#38楼2008-12-07 13:02 | _冻结_      
也就是说,Matrix类型中:
M11、M22 是控制对象的缩放倍数
M12、M21 是控制对象的倾斜倍数
OffsetX、OffsetY 是控制对象的平移偏移

那么,对象的旋转角度怎样在Matrix类型中设置?Matrix不能控制对象的旋转吗?

  回复  引用  查看    
#39楼[楼主]2008-12-08 10:30 | TerryLee      
@_冻结_
这个使用Matrix是可以实现的,基本上所有的变换都可以用它来实现,可以参考一下SDK.

  回复  引用    
#40楼2009-01-14 13:11 | mark hill[未注册用户]
辛苦了!



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

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

0 1113655




相关文章:

相关链接: