一步一步学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 on 2008-03-19 19:00 TerryLee 阅读(6302) 评论(39)  编辑 收藏 所属分类: Silverlight

评论

#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 生鱼片      

支持   回复  引用  查看    

#9楼  2008-03-19 20:50 自由、创新、研究、探索……      

这个系列可以找出版社出本书了,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      

學到這裡了劃個記號先,感恩李老師。   回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-03-19 19:03 编辑过
 
另存  打印
 


导航

公告

  • 网名:TerryLee
  • 本名:李会军
  • 位置:中国北京 Ethos
  • 联系方式:
  • 访问我的个人主页

 MVP配置

 个人主页

 版权声明

  • 本站采用创作共用许可 署名,非商业

绿色通道

IT新闻

统计

与我联系

留言簿(323)

我的标签

随笔分类

随笔档案

个人站点

关注项目

好的网站

我的好友

搜索

积分与排名

阅读排行榜

评论排行榜