Windows Store apps开发[55]变换(Transform)(1)简介
来源:互联网 发布:java输出星号金字塔 编辑:程序博客网 时间:2024/05/21 11:05
注:本文由BeyondVincent(破船)原创首发
转载请注明出处:BeyondVincent(破船)@DevDiv.com
更多内容请查看下面的帖子
[DevDiv原创]Windows 8 开发Step by Step
小引
在程序的开发过程中,变换是一个常用的操作,比如图片的缩放、旋转、移动等,都涉及到变换。在接下来的几篇文章中,我将对变换进行详细的介绍,欢迎你的阅读。
变换简介
变换在数学上的定义是这样的:
非空集合A到自身的一个映射f:A→A称为集合A的变换。
变换是基于一个数学公式:从一个Point到新的一个Point。如果将某个对象所有的Point都应用到这个公式上,就可以达到移动、缩放、旋转等效果。
在Windows Runtime中,UIElement定义了三个属性来支持变换:
- RenderTransform——位置变换信息
- RenderTransformOrigin——RenderTransform变换的原点信息
- Projection——投影效果(三维效果)
这些属性是定义在UIElement上的,可知,所有的Element都可以进行变换,例如:Image、TextBlock和Button。如果在Panel的子类(如Grid)上进行变换,那么这个子类所有的children都会同时被变换。
变换类型
在Windows Runtime中,变换类型有如下:
- 仿射变换——RenderTransform
- 非仿射变换——Projection
仿射变换
仿射变换的继承关系,如下图所示:
从图中我们可以看到,仿射变换有7种类型(粉色部分),平移、缩放、旋转等,在后续的文章中,我会详细介绍如何使用它们。
粉色部分的排列顺序是按照数学公式复杂度排列的,TranslateTransform最简单,TransformGroup最复杂。
这7个类定义了二维仿射变换,对象变换之后,直线依旧是直线,平行关系也不会发生改变。只不过位置、大小、方向发生改变而已。
前面已经说了RenderTransform是UIElement的属性,它的类型是Transform。所以可以把这7种类型赋值给RenderTransform。
非仿射变换——Projection
非仿射变换的继承关系,如下图所示:
非仿射变换主要用于三维视觉,在使用的时候,只需要将PlaneProjection或Matrix3DProjection赋值给UIElement的属性Projection即可。
注:在三维空间中,旋转总是基于某个轴(xyz)进行的。
很明显:在这种情况下,对象的平行关系是会改变的。
Projection变换也经常称为模拟3D变换,比如Flip(翻转)。
在后续的文章中,我会对Projection进行详细介绍。
变换演示
下面我写了个小示例,来演示一下仿射变换和非仿射变换的效果。
左边是原始效果,中间是以正中心为原点,旋转45度,右边是翻转45度
最后附上代码,方便大家自行演示效果
<Page x:Class="BV_Transform_Introduction.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:BV_Transform_Introduction" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="Green"> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <TextBlock Text="原始效果" Grid.Column="0" Grid.Row="0" HorizontalAlignment="Center" FontSize="50" Margin="128,76,127,632"></TextBlock> <Image Grid.Column="0" Grid.Row="0" Source="1.jpg" ></Image> <TextBlock Text="旋转效果" Grid.Column="1" Grid.Row="0" HorizontalAlignment="Center" FontSize="50" Margin="128,76,127,632"></TextBlock> <Image Grid.Column="1" Grid.Row="0" Source="1.jpg" > <Image.RenderTransformOrigin>0.5 0.5</Image.RenderTransformOrigin> <Image.RenderTransform> <RotateTransform Angle="45"/> </Image.RenderTransform> </Image> <TextBlock Text="翻转效果" Grid.Column="2" Grid.Row="0" HorizontalAlignment="Center" FontSize="50" Margin="128,76,127,632"></TextBlock> <Image Grid.Column="2" Grid.Row="0" Source="1.jpg" > <Image.Projection> <PlaneProjection RotationY="60"/> </Image.Projection> </Image> </Grid></Page>
- Windows Store apps开发[55]变换(Transform)(1)简介
- Windows Store apps开发[1]平台简介
- Windows Store apps开发[51]数据绑定(1)绑定模型
- Windows Store apps开发[25]Metro style apps改名为Windows Store apps
- Windows Store apps开发[13]应用程序生命周期
- Windows Store apps开发[44]AppBar总结
- Windows Store apps开发[49]自定义MessageDialog
- Windows Store apps开发[50]自定义Popup
- Windows Store apps开发[23]创建Windows Store应用程序包
- Windows Store apps开发[19]C++/CX Part 0 of [n]: C++/CX简介
- Windows Store apps开发[35]如何创建自己的Windows Store账号来提交Apps
- Windows Store apps开发[57]Windows 8 开发31日
- 1 - Windows Store Apps应用程序模板
- Windows Store apps开发[38]Windows 8中的Semantic Zoom(语义缩放)(1)介绍
- Windows Store apps开发[2]开发环境搭建与HelloWorld
- Windows Store apps开发[26]C++/CX Part 1 of [n]: 一个简单的类
- Windows Store apps开发[0]Step by Step
- Windows Store apps开发[3]应用程序栏(AppBar)的使用
- CityEngine2011安装部署 for Windows(一)
- tiny210上uboot移植备忘
- escape()、encodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent()区别详解
- 最近的一些知识点索引
- Qt 启动画面
- Windows Store apps开发[55]变换(Transform)(1)简介
- Appcan开发之页面布局与CSS排版
- JAVA线程池的分析和使用
- Two Strings
- 编写一函数,形参返回值都是istream&类型...直到遇到EOF
- android sdk创建AVD时,怎样更改AVD的存储路径?
- CityEngine2011安装部署 for Windows(二)
- 创建索引的原则
- 缓存的相关知识