WPF基础篇之移动特效
前一段时间,在做动画特效的时候,在网上看到了一个水平移动控件的例子。里面用到了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基础篇之移动特效的更多相关文章
- WPF基础篇之空间布局
由于之前自己做的都是大多是B/S架构的项目,加入新公司,公司现在用的WPF,在WPF中一个比较重要的知识点:布局 在网上找到一篇比较好的介绍WPF布局的文章. 文章地址:http://www.cnbl ...
- WPF基础篇之系统中141种颜色
WPF最大的特点就是酷炫的外观,在学习过程中经常看见各种渐变窗体.作为几乎没做过美工的程序员,我对各种颜色的argb值不熟,颜色的英文单词也只认识部分.为了不至于每次都用Colors点出颜色再随机挑选 ...
- WPF基础篇之命名空间
WPF中XAML与C#一样,也有自己独立的编译器.XAML会被解析和编译,最终形成微软的中间语言存储在程序集中.在解析和编译XAML的语言过程中,我们经常需要告诉编译器一些重要的信息,比如XAML代码 ...
- WPF基础篇之连接数据库
WPF连接DB2数据库 public void ConnectionBD2Func() { //连接数据库字符串,DB2 9.5以下版本使用Data Source=Test,否则查询找不到数据库.DB ...
- WPF基础篇之资源文件路径
WPF资源文件的路径 关于WPF资源文件的路径 这几天在WPF中调用资源文件的Uri时,因为是在代码里调用Uri写的Uri总是不对,要么运行直接报异常,要么说找不到资源文件.下面是我解决的整个经过和碰 ...
- WPF基础篇之控件模板(ControlTemplate)
WPF中每一个控件都有一个默认的模板,该模板描述了控件的外观以及外观对外界刺激所做出的反应.我们可以自定义一个模板来替换掉控件的默认模板以便打造个性化的控件. 与Style不同,Style只能改变控件 ...
- WPF基础篇之静态资源和动态资源
静态资源(StaticResource)指的是在程序载入内存时对资源的一次性使用,之后就不再访问这个资源了. 动态资源(DynamicResource)指的是在程序运行过程中然会去访问资源. 一.定义 ...
- 2000条你应知的WPF小姿势 基础篇<22-27 WPF生命周期, 基础类等>
端午长假在家陪着女朋友, 幸福感满满,生活对于一只饱经忧患的程序猿来说也是非常重要的,也就暂时没有更新博客.休假结束,回归奋斗的日子了,开始继续更新WPF系列. 在正文开始之前需要介绍一个人:Sean ...
- 2000条你应知的WPF小姿势 基础篇<15-21>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know ...
随机推荐
- CF 246E. Blood Cousins Return [dsu on tree STL]
题意: 一个森林,求k级后代中多少种不同的权值 用set维护每个深度出现的权值 一开始一直在想删除怎么办,后来发现因为当前全局维护的东西里都是当前子树里的,如果要删除那么当前一定是轻儿子,直接清空se ...
- 算法&数据结构系列 -- 堆(优先队列)
前言 话说新开的博客十分好用... 所以,我打算开一个坑,名曰[算法系列]. 什么意思--从名字泥应该就猜得出来... 废话不多说,进入正文~~ 正文 原理 首先,堆是一颗棵二叉树.. 其次,堆是一棵 ...
- jenkins入门系列之一 jenkins的安装
Jenkins是一个CI(持续集成环境)工具.它可以根据设定持续定期编译,运行相应代码:运行UT或集成测试:将运行结果发送至邮件,或展示成报告... 这样做的最终目的是: 让项目保持健康的状态.如果任 ...
- centos java环境搭建
我个人配置的是阿里云centos 7.4 64bit 不存在openjdk 看下面内容的情况下看是否存在openjdk java -version 如果返回java版本值,则存在openjdk,需要卸 ...
- xml对象序列化
public static class XSerializer { /// <summary> /// 将对象序列化为xml字符串 /// </summary> /// < ...
- Job 失败了怎么办?- 每天5分钟玩转 Docker 容器技术(133)
上一节讨论了 Job 执行成功的情况,如果失败了会怎么样呢? 修改 myjob.yml,故意引入一个错误: 先删除之前的 Job: 如果将 restartPolicy 设置为 OnFailure 会怎 ...
- CodeFirst+MySQL+.Net Core配置详情
EF 基础操作:http://www.cnblogs.com/M-LittleBird/p/5852395.html 一.使用CodeFirst模式 1.在需要添加的项目上右键点击选择添加ADD.NE ...
- ucore文件系统详解
最近一直在mooc上学习清华大学的操作系统课程,也算是复习下基本概念和原理,为接下来的找工作做准备. 每次深入底层源码都让我深感操作系统实现的琐碎,即使像ucore这样简单的kernel也让我烦躁不已 ...
- 高并发关于微博、秒杀抢单等应用场景在PHP环境下结合Redis队列延迟入库
第一步:创建模拟数据表. CREATE TABLE `test_table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `uid` int(11) NOT NUL ...
- 老男孩Python全栈开发(92天全)视频教程 自学笔记14
day14课程内容: 深浅拷贝 #浅拷贝只能拷贝一层s=[1,'a','b']s1=s.copy()#浅拷贝print(s1)#[1, 'a', 'b']s[0]=2print(s1,s)#[1, ' ...