前一段时间,在做动画特效的时候,在网上看到了一个水平移动控件的例子。里面用到了RenderTransform特效。在网上查找资料发现了一篇基础的文章:

文章源地址:http://www.ithao123.cn/content-7164732.html

1. RenderTransform特效(五种基本变换)

2. MatrixTransform矩阵变换

RenderTransform(System.Windows.UIElement)特效

  • TranslateTransform  —— 平面位移变换
  • RotationTransform   —— 旋转变换
  • ScaleTransform      —— 缩放变换
  • SkewTransform       —— 扭曲变换
  • TransformGrop       —— 组合(组合上述变换效果)变换
  • MatrixTransform     —— 通过矩阵法算实现复杂变换

1.TranslateTransform

<Canvas Name="canvas_main" Background="Transparent">            
<Label Name="lb_1" Content="After Change" Width="200" Height="45" HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="17" Canvas.Left="0" Canvas.Top="0" Padding="6" BorderBrush="LightBlue" BorderThickness="2">
<Label.RenderTransform>
<TranslateTransform X="50" Y="80"/>
</Label.RenderTransform>
</Label>
<Label Name="lb_2" Content="Before Change" Width="200" Height="45" HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="17" Canvas.Left="0" Canvas.Top="0" Padding="6" BorderBrush="LightBlue" BorderThickness="2">
</Label>
</Canvas>

2.RotationTransform

CenterX和CenterY来设置旋转的中心点。这里定为矩形的右下角为旋转点,顺时针旋转180°。

<Label.RenderTransform> <RotateTransform CenterX="200" CenterY="45" Angle="180"/> </Label.RenderTransform>

3.ScaleTransform

<Label.RenderTransform>      
<ScaleTransform CenterX="0" CenterY="0" ScaleX="2" ScaleY="1"/> </Label.RenderTransform>
上面的例子,我发现。如果只改变ScaleX(1是正常状态),ScaleY保持1不变。此时,无论CenterY为何值,都没有影响。由此可见CenterX指定横向拉伸的基准点,这里是X=0这条直线,向右扩张2倍(如果ScaleX为负值,则向左扩张)。同理CenterY指定竖向的基准轴。

4.SkewTransform

<Label.RenderTransform>     <SkewTransform CenterX="-20" CenterY="0" AngleX="0" AngleY="45"/> </Label.RenderTransform>
这里,(CenterX,CenterY)=(-20,0)指定了中心点。AngleY=45°,绕Y轴旋转45°,注意此时不是绕X=0旋转,而是绕X=-20旋转。所以在不绕X轴(也就是说AngleX固定)时,改变CenterY不会有影响。和Scale相反。

5.TransformGrop

以上四种变换要是想组合起来使用,就可以用TransformGroup组合起来,否则会报错。

<Label.RenderTransform>      
<TransformGroup>
<TranslateTransform X="-200" Y="-45"/>
<ScaleTransform CenterX="100" CenterY="22.5" ScaleX="-1" ScaleY="-1"/>
</TransformGroup>
</Label.RenderTransform>

6. MatrixTransform

有六个值:

{M11,M12,M21,M22,OffsetX,OffsetY}

看几个例子:

比如现在有一个点(2,5),

这里M11=1,M12=0,M21=0,M22=1,这是它们的默认值,对点的位置没有影响。它们构成这样的一个矩阵:

如果需要位移的话,可以加上偏移OffsetX和OffsetY,于是有这样的公式:

将M11,M12,M21,M22默认值(1,0,0,1)代入:

根据这个公式,我们可以从底层来实现上面几个平移、选择、扭曲的功能。

平移:

<Label.RenderTransform>     <MatrixTransform  Matrix="1,0,0,1,80,30"/> </Label.RenderTransform>

结论:OffsetX和OffsetY控制水平和竖直方向的偏移。

拉伸:

x方向拉伸了1倍。

<MatrixTransform  Matrix="2,0,0,1,0,0"/>

结论:M11控制X方向的伸缩,M22控制Y方向的伸缩。

旋转:

90度旋转:

例如,现在有点(x,y),要求选择90度:

两个向量垂直,则向量积为0,得:

那么究竟M12=1,M21=-1还是M12=-1,M21=1呢?这取决于顺时针旋转还是逆时针旋转。这里M12=1是顺时针,反之为逆时针。

<MatrixTransform  Matrix="0,-1,1,0,155,200"/>

这里逆时针旋转90度后,加上Offset后,效果如上。加起来的效果就是沿右上角逆时针旋转90度。

结论:如果Matrix不是按默认值(+-1,0,0,+-1)设置,那么就有可能做旋转操作,几种情况分析如下。

角度 原始值 顺时针 逆时针
0 (x,y) (x,y)(1,0,0,1) 同左
90 (x,y) (y,-x)(0,-1,1,0) (-y,x)(0,1,-1,0)
180 (x,y) (-x,-y)(-1,0,0,-1) 同左
270 (x,y) (-y,x)(0,1,-1,0) (y,-x)(0,-1,1,0)
 
 

WPF基础篇之移动特效的更多相关文章

  1. WPF基础篇之空间布局

    由于之前自己做的都是大多是B/S架构的项目,加入新公司,公司现在用的WPF,在WPF中一个比较重要的知识点:布局 在网上找到一篇比较好的介绍WPF布局的文章. 文章地址:http://www.cnbl ...

  2. WPF基础篇之系统中141种颜色

    WPF最大的特点就是酷炫的外观,在学习过程中经常看见各种渐变窗体.作为几乎没做过美工的程序员,我对各种颜色的argb值不熟,颜色的英文单词也只认识部分.为了不至于每次都用Colors点出颜色再随机挑选 ...

  3. WPF基础篇之命名空间

    WPF中XAML与C#一样,也有自己独立的编译器.XAML会被解析和编译,最终形成微软的中间语言存储在程序集中.在解析和编译XAML的语言过程中,我们经常需要告诉编译器一些重要的信息,比如XAML代码 ...

  4. WPF基础篇之连接数据库

    WPF连接DB2数据库 public void ConnectionBD2Func() { //连接数据库字符串,DB2 9.5以下版本使用Data Source=Test,否则查询找不到数据库.DB ...

  5. WPF基础篇之资源文件路径

    WPF资源文件的路径 关于WPF资源文件的路径 这几天在WPF中调用资源文件的Uri时,因为是在代码里调用Uri写的Uri总是不对,要么运行直接报异常,要么说找不到资源文件.下面是我解决的整个经过和碰 ...

  6. WPF基础篇之控件模板(ControlTemplate)

    WPF中每一个控件都有一个默认的模板,该模板描述了控件的外观以及外观对外界刺激所做出的反应.我们可以自定义一个模板来替换掉控件的默认模板以便打造个性化的控件. 与Style不同,Style只能改变控件 ...

  7. WPF基础篇之静态资源和动态资源

    静态资源(StaticResource)指的是在程序载入内存时对资源的一次性使用,之后就不再访问这个资源了. 动态资源(DynamicResource)指的是在程序运行过程中然会去访问资源. 一.定义 ...

  8. 2000条你应知的WPF小姿势 基础篇<22-27 WPF生命周期, 基础类等>

    端午长假在家陪着女朋友, 幸福感满满,生活对于一只饱经忧患的程序猿来说也是非常重要的,也就暂时没有更新博客.休假结束,回归奋斗的日子了,开始继续更新WPF系列. 在正文开始之前需要介绍一个人:Sean ...

  9. 2000条你应知的WPF小姿势 基础篇<15-21>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know ...

随机推荐

  1. Flask-Moment----探索

    前言:  Flask-Moment在所有的flask扩展中算是相对简单的一个了,但是还是有很多需要理解的地方.那么今天就跟着笔者一起,来学习一下flask-moment在flask项目中的应用. 首先 ...

  2. is there any way to stop auto block

    shadowsocks出现错误日志 tail /var/log/ssserver.log 2017-07-02 12:36:31 ERROR: block all requests from 10.4 ...

  3. Jenkins实现PHP的自动部署

    1.汉化jenkins 1).安装汉化包 系统管理 -> 插件管理 -> 安装插件 ->选择插件(Locale plugin) 2).设置语言为中文 系统管理 -> 系统设置 ...

  4. 【国家集训队2010】小Z的袜子[莫队算法]

    [莫队算法][国家集训队2010]小Z的袜子 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程, ...

  5. 卷积神经网络(CNN)在句子建模上的应用

    之前的博文已经介绍了CNN的基本原理,本文将大概总结一下最近CNN在NLP中的句子建模(或者句子表示)方面的应用情况,主要阅读了以下的文献: Kim Y. Convolutional neural n ...

  6. Oauth认证协议

    原文地址腾讯QQ第三方登录的实现原理? Oauth当中的角色: 1.Service Provider(服务提供方): 服务提供方通常是网站,在这些网站当中存储着一些受限制的资源,如照片.视频.联系人列 ...

  7. Service工作过程

    Service两种工作状态的作用 1)启动状态:用于执行后台计算 2)绑定状态:用于其他组件和Service的交互 注意:Service这两种状态可以共存,即Service既可以处于启动状态也可以同时 ...

  8. numpy模块中的sum(axis)方法

    1.sum函数声明 sum(a, axis=None, dtype=None, out=None, keepdims=<class 'numpy._globals._NoValue'>) ...

  9. UVALive - 4329 Ping pong 树状数组

    这题不是一眼题,值得做. 思路: 假设第个选手作为裁判,定义表示在裁判左边的中的能力值小于他的人数,表示裁判右边的中的能力值小于他的人数,那么可以组织场比赛. 那么现在考虑如何求得和数组.根据的定义知 ...

  10. java网络编程(7)——利用tcp实现文件上传

    其实客户端与服务端通讯的道理都是一样的,都是通过输入与输出这两个流,那么实现文件上传也就是同样的,客户端把文件读到文件流,服务端用文件流来接受,然后写到一个文件中,这样子就实现了文件上传,文件拷贝也是 ...