前一段时间,在做动画特效的时候,在网上看到了一个水平移动控件的例子。里面用到了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. Jmeter_实现操作postgresql数据库

    [环境] ①Jmeter版本:3.2,JDK:1.8: ②postgresql驱动包postgresql-9.3-1103.jdbc4,将该jar包置于..\apache-jmeter-3.2\lib ...

  2. JavaWeb项目架构之NFS文件服务器

    NFS简介 NFS(Network File System)即网络文件系统. 主要功能:通过网络(局域网)让不同的主机系统之间可以共享文件或目录. 主要用途:NFS网络文件系统一般被用来存储共享视频, ...

  3. Hot Research Topics

  4. ansible实践2-拷贝文件或目录

      ansible testhost -m copy -a "src=/etc/ansible  dest=/tmp/ansibletest owner=root group=root mo ...

  5. Linux 每日命令行

    uptime 用于查看系统的负载信息. 它依次显示 当前系统时间.系统已运行时间.启用终端数量及平均负载值等信息.平均负载指的是系统在最近1分钟.5分钟.15分钟内的压力情况:负载值越低越好,尽量不要 ...

  6. Mock拦截ajax请求

    //mock拦截ajax请求 ,生成随机数据Mock.mock('./servlet/UserServlet?method=getUser',{ 'list|1-5':[{ 'username':'@ ...

  7. java库中的具体的集合

    1.ArrayList  一种可以动态增长和缩减的索引序列:速度较慢适合用于不修改太多的元素    采用的数组 2.LinkEdList  一种可以在任何位置进行高效的插入和删除操作的有序序列,适合于 ...

  8. 算法提高 P1001

    必须感叹下,大数模板就是好用! AC代码: #include <cstdio> #include <cmath> #include <algorithm> #inc ...

  9. logback KafkaAppender 写入Kafka队列,集中日志输出.

    为了减少应用服务器对磁盘的读写,以及可以集中日志在一台机器上,方便使用ELK收集日志信息,所以考虑做一个jar包,让应用集中输出日志 网上搜了一圈,只发现有人写了个程序在github 地址:https ...

  10. 如何高效的编写Verilog HDL——进阶版

    博主之前写过一篇文章来谈论如何高效的编写Verlog HDL——菜鸟版,在其中主要强调了使用Notepad++来编写Verilog HDL语言的便捷性,为什么说是菜鸟版呢,因为对于新手来说,在还没有熟 ...