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)
 
 
上一篇:【JavaScript实用技巧(二)】Js操作DOM(由问题引发的文章改版,新人大佬都可)


下一篇:BZOJ 2879: [Noi2012]美食节 最小费用流 动态添边