前回:Windows Phoneの開発をしてみる ~環境導入編~ - さわっても熱くない花火
前回はとりあえず環境を入れてサンプルを作ってみましたけど、今回は何かものを作ってみます。
もっと早く作り始めたかったのに、忙しかったからなぁ
作るもの
TumblrPhotoViewer(どやぁ
コンセプト
- LikeとかReblogとかは考えない*1
- ユーザーIDを入力させて、そのユーザーのPostを閲覧するだけ
- 画像しか読ませない
- TumblrAPIはバージョン1を利用する
- ページ遷移とかは適当なアニメーションを使う
- 面倒なのでthis.NavigationService.Navigateメソッドでページ遷移を実現
- Expression Blendはよくわからないので、今回は使わない
ほら!そこの君!手抜きとか言わないっ
メモ
開発中に詰まった事を適当にメモっとく…
画面遷移のアニメーション実装方法
Silverlight fot Windows Phone 7 Toolkitがめっちゃ便利 - tmytのらくがき
TransitionServiceを使って画面遷移時にアニメーションを行う – CH3COOH(酢酸)の実験室
本当はExpression Blendを使った方が良いのかな?まぁいいや
Silverlight fot Windows Phone 7 Toolkitを下のURLからダウンロードする。
Silverlight Toolkit - Download: Windows Phone Toolkit - Nov 2011 (7.1 SDK)
次にMicrosoft.Phone.Controls.Toolkitへの参照を追加。
あとは上のURLに書いてあるようにうにうにする。
簡単にメトロUI特有の「パタパタ」した感じの画面遷移が実装できるんですねー!
画面遷移後にURLのクエリ文字を受け取る
WindowsPhoneで画面遷移 - がりらぼWP7 ~WindowsPhoneプログラミング情報発信ラボ~
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { IDictionary<string, string> param = NavigationContext.QueryString; //ここでクエリ文字をmogmogする //param["クエリ名"]で参照 base.OnNavigatedTo(e); }
XDocument.Loadの問題を解決する
Windows Phone 7 のはてなフォトライフビューワを作る (前編) - backyard of 伊勢的新常識
Windows PhoneなXDocument.Loadはどうやら相対URIにしか対応してないらしいです。
なので、上のページに書いてあるようにMicrosoft.Phone.Reactiveを使って見ることにします。
WebClient webC = new WebClient(); Observable.FromEvent<DownloadStringCompletedEventArgs>(webC, "DownloadStringCompleted") .Select(doc => XDocument.Load(new StringReader(doc.EventArgs.Result))) .ObserveOnDispatcher() .Do(doc => { var postsElements = doc.Element("tumblr").Element("posts"); //以下XMLをぺしぺしする作業 //メインのメソッドで実行されるので、コントロールをぺしぺししてもおk }) .Subscribe(); string apiUrl = string.Format(@"http://{0}.tumblr.com/api/read?start={1}&num=1", userId, nowPageNum); webC.DownloadStringAsync(new Uri(apiUrl));
ちなみに通信系のエラー処理対策のために、doc => XDocument.Load(new StringReader(doc.EventArgs.Result)…に例外処理を入れたほうがいいかもしれません。
Imageコントロールで縦横比を維持して最大表示
StretchプロパティをUniformにすればいいらしい。
フリックなイベントを得る
MSDN マガジン: UI 最前線 - Windows Phone でのタッチ ジェスチャ
Microsoft.Phone.Controls.Toolkitを参照しておく必要があるみたいです。
で、次のような感じにxamlを書くとうまくいくらしいです
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="0,0,0,0"> <Image Name="imageBox" Stretch="Fill" /> <toolkit:GestureService.GestureListener> <toolkit:GestureListener Flick="GestureListener_Flick" /> </toolkit:GestureService.GestureListener> </Grid>
例ではImageコントロール上でフリックされたらイベントが発生します(多分
コードでは次みたいに使えばいいらしいです。
private void GestureListener_Flick(object sender, FlickGestureEventArgs e) { if (e.HorizontalVelocity < 0) { //左方向へのフリック } else { //右方向へのフリック } }
という訳で完成
動いているから多分完成だと思う
手抜きだけどまぁいいやー
今度はこれを公開できるのか試してみよう。
*1:OAuthが面倒だから(ぁ