春節快樂


Hi,

各位園主和博客園的工作人員們,先預祝大家春節快樂!

想任性地給大家送一份春節的禮物,但是我們程序員沒多少錢,真是送不起啊,可我們有技術啊,於是我們特地用飛快的速度制作了一個“微軟對聯”App,2月10日在Windows Phone Store上線了。

link在這里,請大家下載后娛樂一下:

http://www.windowsphone.com/zh-cn/store/app/%E5%BE%AE%E8%BD%AF-%E5%AF%B9%E8%81%94/25035c46-0362-40b9-9c84-fd4a3cafe4df

image

與別的對聯App不同的是,由於在后台有微軟MSRA的電腦對聯系統的技術支持,用戶可以自己擬定上聯,然后讓電腦給你出一些下聯的建議,你可以做進一步的修改,然后再讓電腦給你出一些橫批的建議,你當然還可以修改,最后出一幅令自己滿意的對聯!

下面簡單介紹一下這個App的開發過程,供大家參考。

主頁

image

主頁上有四個動畫,可以先聲奪人地讓用戶眼前一亮,自然會對你的App產生好感。

第一個動畫:福字在中央從小到大360度旋轉着出現,動畫定義如下:

<Storyboard x:Name="sb_FuRotate">
            <DoubleAnimation Storyboard.TargetName="img_Fu" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)"
                             From="0" To="360" Duration="0:0:1"/>
            <DoubleAnimation Storyboard.TargetName="img_Fu" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)"
                             From="0" To="1" Duration="0:0:1"/>
            <DoubleAnimation Storyboard.TargetName="img_Fu" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)"
                             From="0" To="1" Duration="0:0:1"/>
        </Storyboard>

這是三個小動畫的組合:

1)做360度平面旋轉

2)X軸拉伸,從0到1,也就是從無到原始大小

3)Y軸拉伸,從0到1

第二個動畫:五個菜單從左側順序飛入,動畫定義如下:

<Storyboard x:Name="sb_MenuFlyIn" Completed="sb_Fly_Completed">
            <DoubleAnimation Storyboard.TargetName="menu1" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)"
                                                 From="-250" To="0" Duration="0:0:0.20"/>
            <DoubleAnimation Storyboard.TargetName="menu2" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)"
                                                 From="-250" To="0" Duration="0:0:0.20" BeginTime="0:0:0.10"/>
            <DoubleAnimation Storyboard.TargetName="menu3" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)"
                                                 From="-250" To="0" Duration="0:0:0.20" BeginTime="0:0:0.20"/>
            <DoubleAnimation Storyboard.TargetName="menu4" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)"
                                                 From="-250" To="0" Duration="0:0:0.20" BeginTime="0:0:0.30"/>
            <DoubleAnimation Storyboard.TargetName="menu5" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)"
                                                 From="-250" To="0" Duration="0:0:0.20" BeginTime="0:0:0.40"/>
        </Storyboard>

每個子動畫的參數都一樣,都是從-250的位置,也就是頁面左側外部,在X軸(橫向)進入頁面。但是如果一起進入效果不好,所以做了一個時間差,從第二個菜單開始,用BeginTime=”0:0:0.10”設置了一個延遲,也就是每隔10毫秒,飛入一個菜單。

第三個動畫:福字從中央的位置飛到頁面右下角,並作為Setting Page的入口可以點擊,動畫定義如下:

<Storyboard x:Name="sb_FuMoveDown" Completed="sb_FuMoveDown_Completed">
            <DoubleAnimation Storyboard.TargetName="img_Fu" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)"
                             From="0" To="540" Duration="0:0:1"/>
            <DoubleAnimation Storyboard.TargetName="img_Fu" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)"
                             From="1" To="0.2" Duration="0:0:1"/>
            <DoubleAnimation Storyboard.TargetName="img_Fu" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)"
                             From="1" To="0.2" Duration="0:0:1"/>
            <DoubleAnimation Storyboard.TargetName="img_Fu" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)"
                             From="0" To="100" Duration="0:0:1"/>
            <DoubleAnimation Storyboard.TargetName="img_Fu" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)"
                             From="0" To="100" Duration="0:0:1"/>
        </Storyboard>

也是一些子動畫的組合。

1)福字平面旋轉540度,最后是倒着的

2)在X軸拉伸到原尺寸的0.2

3)在Y軸拉伸到原尺寸的0.2

4)在X軸橫向移動一些距離

5)在Y軸豎向移動一些距離

在XAML中,雖然定義了移動的距離是100,但是考慮到不同手機的屏幕大小不一樣,所以需要用code實際算一下:

DoubleAnimation da1 = this.sb_FuMoveDown.Children[3] as DoubleAnimation;
da1.To = this.ActualWidth / 2 - 60;
DoubleAnimation da2 = this.sb_FuMoveDown.Children[4] as DoubleAnimation;
da2.To = this.ActualHeight / 2 - 50;
this.sb_FuMoveDown.Begin();

首先獲得實際的屏幕寬度,除以2再減去60,也就是從中間向右移動距離右邊60個像素的位置,Y方向同理,然后再執行動畫。

第四個動畫比較簡單,就是“微軟對聯”4個字總上部飛下來:

<Storyboard x:Name="sb_TitleFlyIn">
            <DoubleAnimation Storyboard.TargetName="tb_Title" 
                             Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)"
                             From="-400" To="0" Duration="0:0:1"/>
        </Storyboard>

這種“飛入”,要在屏幕上先定義好最終的位置,然后用-400來定義起飛的位置,終點位置一定是0。

 

寫對聯

寫對聯一共有3頁,擬上聯,對下聯,題橫批:

image image image

擬上聯,首先預定義一些羊年的吉祥話在本地文件里,用JSON格式,頁面顯示時綁定在ListView上就可以了。注意ListView一定要放在Grid里,如果放在StackPanel里,ListView在屏幕外的部分會把StackPanel拉長,從而造成ListView在屏幕外的部分始終看不到。

對下聯,后台調用了MSRA提供的API,自動生成一些建議。

題橫批,也是調用了API,自動生成4字橫批。

效果頁

效果頁的制作比較復雜。

image

這張圖是5個字的例子,但是對聯允許1-10個字,所以在10個字時,字號要縮小到剛好充滿屏幕高度的值,才能使整個效果完美。而且TextBlock里不能豎着寫字,用折行也不好控制左右邊距,因此我們使用了最原始的方法,一個字一個字的拼上去:

for (int i = 0; i < this.favCouplet.shanglian.Length; i++)
{
                        CharControl cc = new CharControl();
                        cc.DataContext = this.favCouplet.shanglian[i];
                        cc.FontFamily = this.favCouplet.Font;
                        cc.Foreground = this.favCouplet.Color;
                        this.sp_Left.Children.Add(cc);
float scaleValueL = float.Parse((this.scrollLeft.ActualHeight / sp_Left.ActualHeight > this.scrollLeft.ActualWidth / sp_Left.ActualWidth ? this.scrollLeft.ActualWidth / sp_Left.ActualWidth : this.scrollLeft.ActualHeight / sp_Left.ActualHeight).ToString());
                        this.scrollLeft.ChangeView(null, null, scaleValueL);
}

但是要同時保證外邊框完整,所以把外邊框分成了3個圖片元素:

image

image

image

中間的那個可以隨着字數任意擴展數量,兩頭的圖片最后拼接上去即可。

搞好整體效果后,可以通過5種方式分享給朋友們:短信,郵件,微博,圖片(可供微信分享),雲端。

可選效果

image

底板變成了木紋,紅色紙張也變了另一個樣子,是通過改Style實現的。福字是可以點擊的,點一次旋轉180度,可正可倒。

字體

我們使用了3種字體:普通等線字體,姑且叫黑體吧;楷體;隸書。后兩種字體在WP中沒有,你可以從Windows的ControlPanel->Font中把楷體字體文件拷貝下來,作為Assets的一部分放在資源中,然后當你編輯TextBlock時,會在Text的Font中,最上面,多出一種字體,就是楷體:

image

我們為什么沒有使用書法體從而使對聯更有手寫感呢?因為書法體是要買的,有知識產權。咱們要注意素質。

雲端對聯

image

你寫好的對聯,如果特滿意,可以上傳到雲端;同時你也可以從雲端下載其它人的得意之作,亂改一氣,作為自己的作品。點擊雲端對聯可以直接進入效果頁。

好吧,先寫到這里,一會兒收拾收拾回家了。別忘了下載我們的春聯App喲!

http://www.windowsphone.com/zh-cn/store/app/%E5%BE%AE%E8%BD%AF-%E5%AF%B9%E8%81%94/25035c46-0362-40b9-9c84-fd4a3cafe4df

MSRA的網頁版對聯在這里:http://couplet.msra.cn/

 

祝大家春節快樂!

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM