Windows Phone開發(18):變形金剛第九季——變換

來源:互聯網
上載者:User

變換不是一個好理解的概念,不是嚇你,它涉及很多有關代數,幾何,以及線性代數的知識。怎嗎?被我的話嚇怕了?不用怕,儘管我們未必能夠理解這些概念,只要我們知道怎麼使用它們就是了。
其實,變換就是平面上一種座標變化,聽起來很抽象,但,只要我把它說具體了,你就會覺得不抽象了。
相信各位如果玩過Photoshop,或者其它的繪圖軟體,應該知道什麼叫做旋轉,什麼叫做傾斜,什麼叫做平移……
是的,這些就是我們今天要聊的變換,好了,現在你是不是可以坐下來喝一杯珍珠奶茶來放鬆一下呢?哦,對了,珍珠奶茶盡量少喝哦。

好,閑話少吹,開始今天的表演。

 

一、TranslateTransform。

這個應該算是最好理解了,就是平移嘛,相信大家不會陌生的,學習解析幾何的時候是不是經常玩啊?它無非就兩個參數——X和Y,分別是平面上兩個方向的位移。

中的三個矩形,它們的位置是一樣的,但經過平移後,看起來它們好像不在同一個位置了。

<Canvas><br /> <!-- 三個矩形在Canvas中的位置是相同的,但經過平移變換後,<br /> 看起來,好像並不在同一個位置了。<br /> --><br /> <Rectangle Width="120" Height="120"<br /> Fill="DarkGreen"<br /> Canvas.ZIndex="0"<br /> Canvas.Top="15"<br /> Canvas.Left="15"><br /> <Rectangle.RenderTransform><br /> <TranslateTransform X="20" Y="20"/><br /> </Rectangle.RenderTransform><br /> </Rectangle><br /> <Rectangle Width="120" Height="120"<br /> Fill="Yellow"<br /> Canvas.ZIndex="1"<br /> Canvas.Top="15"<br /> Canvas.Left="15"><br /> <Rectangle.RenderTransform><br /> <TranslateTransform X="80" Y="80"/><br /> </Rectangle.RenderTransform><br /> </Rectangle><br /> <Rectangle Width="120" Height="120"<br /> Fill="Blue"<br /> Canvas.ZIndex="2"<br /> Canvas.Top="15"<br /> Canvas.Left="15"><br /> <Rectangle.RenderTransform><br /> <TranslateTransform X="140" Y="140"/><br /> </Rectangle.RenderTransform><br /> </Rectangle><br /> </Canvas>

 

二、RotateTransform。

這個傢伙就是用來旋轉元素的,Angle屬性就是旋轉的角度,不用我解釋了吧,小學生的知識。另外,有兩個屬性要注意一下:
CenterX:旋轉中心的X座標,這個座標是相對於目標的左上方的,例如,你要讓一個矩形轉旋轉,預設的情況,旋轉中心就是0,就是矩形的左上方;
CenterY:和上面一樣了,只是Y座標的點。

這兩個旋轉點不太好把握,如果我們希望比較的相對定位,可以通過UIElement的RenderTransformOrigin屬性來改動旋轉原點,這個點座標是相對於元素可視化的邊界的,即0到1之間的值,如:
1、左上方:(0,0)
2、左下角:(1,1)
3、頂部置中:(0.5,0)
4、底部置中:(0.5,1)

中的三個圖象,旋轉中心都在底部置中,只是旋轉的角度不同而已。

<Grid><br /> <Image Margin="289,42,241,143" Source="/TransFormSample;component/1.jpg" Stretch="Uniform" Opacity="0.3"<br /> RenderTransformOrigin="0.5,1"><br /> <Image.RenderTransform><br /> <RotateTransform Angle="-60"/><br /> </Image.RenderTransform><br /> </Image><br /> <Image Margin="289,42,241,143" Source="/TransFormSample;component/1.jpg" Stretch="Uniform" Opacity="0.6"<br /> RenderTransformOrigin="0.5,1"><br /> <Image.RenderTransform><br /> <RotateTransform Angle="0"/><br /> </Image.RenderTransform><br /> </Image><br /> <Image Margin="289,42,241,143" Source="/TransFormSample;component/1.jpg" Stretch="Uniform"<br /> RenderTransformOrigin="0.5,1"><br /> <Image.RenderTransform><br /> <RotateTransform Angle="60"/><br /> </Image.RenderTransform><br /> </Image><br /> </Grid>

 

 

三、ScaleTransform。

與上面的旋轉變換相似,但這個是用於放大和縮小的,它也有一個中心點,就是縮放中心,同樣,它的預設值是目標元素的左上方,至於以哪個點為縮放中心,你就自己調整中心座標了。

 

中為了能清楚看到縮放的效果,後面兩個圖象都設定透明度。

<Grid><br /> <Image Source="/TransFormSample;component/1.jpg" Stretch="Uniform" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="130"<br /> Canvas.ZIndex="0" Opacity="0.09"><br /> <Image.RenderTransform><br /> <ScaleTransform CenterX="110" CenterY="180" ScaleX="2" ScaleY="2"/><br /> </Image.RenderTransform><br /> </Image></p><p> <Image Source="/TransFormSample;component/1.jpg" Stretch="Uniform" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="130"<br /> Canvas.ZIndex="1" Opacity="0.2"><br /> <Image.RenderTransform><br /> <ScaleTransform CenterX="120" CenterY="150" ScaleX="1.6" ScaleY="1.6"/><br /> </Image.RenderTransform><br /> </Image></p><p> <Image Source="/TransFormSample;component/1.jpg" Stretch="Uniform" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="130"<br /> Canvas.ZIndex="2"/><br /> </Grid>

 

 

四、SkewTransform。

扭曲變換,可以說是傾斜,它的確實現了傾斜的效果。
同樣它也有一個中心點,與上面的相似,AngleX是沿X軸扭曲的角度,AngleY就是沿Y軸扭曲。

 

<Grid><br /> <Image Source="/TransFormSample;component/1.jpg" HorizontalAlignment="Center"<br /> VerticalAlignment="Center"<br /> Margin="100"/><br /> <Image Source="/TransFormSample;component/1.jpg" HorizontalAlignment="Center"<br /> VerticalAlignment="Center"<br /> Margin="100" Opacity="0.3"><br /> <Image.RenderTransform><br /> <SkewTransform CenterX="0" CenterY="-200" AngleX="30" AngleY="0"/><br /> </Image.RenderTransform><br /> </Image><br /> <Image Source="/TransFormSample;component/1.jpg" HorizontalAlignment="Center"<br /> VerticalAlignment="Center"<br /> Margin="100" Opacity="0.3"><br /> <Image.RenderTransform><br /> <SkewTransform CenterX="0" CenterY="-550" AngleX="-15" AngleY="0"/><br /> </Image.RenderTransform><br /> </Image></p><p> </Grid>

 

 

五、TransformGroup。

嚴格上說,這個不算是一種變換,但它可以實現把N個變換疊加在一起。

 

<Grid><br /> <Image Source="/TransFormSample;component/1.jpg"<br /> Stretch="Uniform" Margin="65,98,472,92" /><br /> <Image Source="/TransFormSample;component/1.jpg"<br /> Stretch="Uniform" Margin="65,98,472,92" ><br /> <Image.RenderTransform><br /> <TransformGroup><br /> <TranslateTransform X="270" Y="30"/><br /> <ScaleTransform ScaleX="1.5" ScaleY="1.5" CenterX="185" CenterY="280"/><br /> <RotateTransform CenterX="400" CenterY="60" Angle="18"/><br /> </TransformGroup><br /> </Image.RenderTransform><br /> </Image></p><p> </Grid><br />

 

 

 

 

六、CompositeTransform。

這與上面的TransformGroup有點像,但你也看到,它不是把多個變換疊加,而是同時應用多種變換方式,但它是有順序的。
縮放 ->扭曲->旋轉->位移

 

 

<Grid><br /> <Image Source="/TransFormSample;component/1.jpg" Stretch="Uniform" Margin="48,68,492,131" /><br /> <Image Source="/TransFormSample;component/1.jpg" Stretch="Uniform" Margin="48,68,492,131"<br /> Opacity="0.5"><br /> <Image.RenderTransform><br /> <CompositeTransform<br /> CenterX="250" CenterY="185"<br /> Rotation="45"<br /> SkewX="15" SkewY="15"<br /> ScaleX="1.2" ScaleY="1.2"<br /> TranslateX="230" TranslateY="200"/><br /> </Image.RenderTransform><br /> </Image></p><p> </Grid>

 

 

 

七、MatrixTrasform。

這是最複雜的一種變換,它是一個3乘3的矩陣,但是,由於它第3列為0,0,1,所以,其實我們只需設定6個值就夠了。它們分別是:
 m11       m12     0
 m21       m22     0
 offsetX  offsetY  1
可能是offsetX和offsetY比較容易看出來就是位移,那前面幾呢?我們可以猜,預設值為1的就是縮放,因為不可能為0倍,剩下兩個就是X軸和Y軸方向的傾斜值了。

其實,我也是通過寫代碼來找規律的,保持其實參數不變單獨改變一個參數來觀察圖形的變化就能找到答案了。

        m11 ——X軸縮放
        m12 ——Y軸上傾斜
        m21 ——X軸上傾斜
        m22——Y軸縮放
        offsetX ——X軸上的位移
        offsetY ——Y軸上的位移

 

 

<Grid><br /> <Image Height="206" HorizontalAlignment="Left" Margin="73,104,0,0" Name="image1" Stretch="Uniform" VerticalAlignment="Top" Width="139" Source="/TransFormSample;component/1.jpg"><br /> <Image.RenderTransform><br /> <MatrixTransform Matrix="2,0,0,1,12,6"/><br /> </Image.RenderTransform><br /> </Image><br /> <Image Height="206" HorizontalAlignment="Left" Margin="122,424,0,0" Name="image2" Source="/TransFormSample;component/1.jpg" Stretch="Uniform" VerticalAlignment="Top" Width="136" ><br /> <Image.RenderTransform><br /> <MatrixTransform Matrix="1,-1,0,1,0,137"/><br /> </Image.RenderTransform><br /> </Image><br /> <Image Height="206" HorizontalAlignment="Left" Margin="293,12,0,0" Name="image3" Source="/TransFormSample;component/1.jpg" Stretch="Uniform" VerticalAlignment="Top" Width="139" ><br /> <Image.RenderTransform><br /> <MatrixTransform Matrix="1,0.6,0,1,0,0"/><br /> </Image.RenderTransform><br /> </Image><br /> <Image Height="206" HorizontalAlignment="Left" Margin="269,424,0,0" Name="image4" Source="/TransFormSample;component/1.jpg" Stretch="Uniform" VerticalAlignment="Top" Width="139" ><br /> <Image.RenderTransform><br /> <MatrixTransform Matrix="1,1,0,1,0,0"/><br /> </Image.RenderTransform><br /> </Image><br /> </Grid>

 

如何學習有關變換的知識呢?個人推薦一種方法,很有效,那就是——亂來。
真的,亂來的學習效果很好的,呵呵。

你可以寫好代碼,然後不斷地改變數值,看看有什麼變化,多試幾次你就會找到規律。

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.