atelier:mitsuba

i love UI/UX, Blend, XAML, Behavior, P5, oF, Web, Tangible Bits and Physical computing. なにかあればお気軽にご連絡ください。atelier@c-mitsuba.com

Windows Phone 7 のはてなフォトライフビューワを作る (後編)その2ー画像の縦横比を崩さないー

次に、ImagePage.xamlで表示される画像の比率がおかしいので、それを直しましょう。

まず、オブジェクトパネルからimageを選択します。

次に共通プロパティを見てみましょう。
StretchがFillになっていますね。

Fillっていうのは、縦横比を保持せずにその領域を埋める設定ですね。
これをUniformに変更します。

Uniformは縦横比を維持しながら、領域に収まるようにコンテンツのサイズを変更するプロパティですね。

一応Uniformの最初のサイズが領域を超えないように制限をかけておきます。
Uniformだと収まるように変更してくれるはずですが、なぜか付けてました。
なくてもいいと思います。

最後にレイアウトを編集して、imageがContentPanelの真ん中に表示されるように設定します。
触るのはHorizonAlignmentとVerticalAlignmentを触ればいいですね。

これで、縦横比が崩れずに綺麗な画像が表示されるようになりますね。

Windows Phone 7 のはてなフォトライフビューワを作る (後編)その3ージェスチャーを実装しようー

次にImagePage.xamlのimageをジェスチャーに対応させましょう。

現在のImageコントロールはこんな感じだと思います。

ImagePage.xaml

<Image HorizontalAlignment="Center" x:Name="image" VerticalAlignment="Center" MaxWidth="456" RenderTransformOrigin="0.5,0.5" />

これを拡張します。
ジェスチャーに対応するには Silverlight toolkit for windowsphoneを使います。
インストールしてない人はインストールしてください。
http://silverlight.codeplex.com/releases/view/60291
インストールできたら、dllを参照してください。

次にimageコントロールにプロパティを追記します。
ここはBlendのプロパティタブにはないので、手書きになります。

        	<Image HorizontalAlignment="Center" x:Name="image" VerticalAlignment="Center" MaxWidth="456" RenderTransformOrigin="0.5,0.5">
        		<Image.Projection>
        			<PlaneProjection/>
        		</Image.Projection>
        		<Image.RenderTransform>
        			<CompositeTransform x:Name="transform"/>
        		</Image.RenderTransform>
        		<toolkit:GestureService.GestureListener>
        			<toolkit:GestureListener 
        				Hold="OnHold" DoubleTap="OnDoubleTap"
        				DragDelta="OnDragDelta"
        				PinchStarted="OnPinchStarted" PinchDelta="OnPinchDelta"/>
        		</toolkit:GestureService.GestureListener>
        	</Image>

解説です。
ジェスチャーで、画像の回転やサイズの変更を行うので、まずその下準備をしてやる必要があります。
それが以下ですね。 x:Name="transform"を書いているのは、あとでここをC#から呼んでくるので名前をつけています。

        		<Image.Projection>
        			<PlaneProjection/>
        		</Image.Projection>
        		<Image.RenderTransform>
        			<CompositeTransform x:Name="transform"/>
        		</Image.RenderTransform>

で、下のGesturelListenerが実際にジェスチャーのイベントを取得してるところですね。
ジェスチャの動作名="イベント名"でメソッドが走る仕組みになっています。
楽ですねぇ。

        		<toolkit:GestureService.GestureListener>
        			<toolkit:GestureListener 
        				Hold="OnHold" DoubleTap="OnDoubleTap"
        				DragDelta="OnDragDelta"
        				PinchStarted="OnPinchStarted" PinchDelta="OnPinchDelta"/>
        		</toolkit:GestureService.GestureListener>

では、今度はそのメソッドを書いていきましょう
ImagePage.xaml.csですね。
ごそっと載せてみます。
解説は/**/でコード内に書いていきます。

ImagePage.xaml.c

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.Windows.Media.Imaging;

namespace FotolifeView
{
    public partial class ImagePage : PhoneApplicationPage
    {

       // double initialAngle;
        double initialScale;

        public ImagePage()
        {
            InitializeComponent();
        }

        /*ダブルタップすると、画像を初期位置初期サイズに戻します。*/
        private void OnDoubleTap(object sender, GestureEventArgs e)
        {
            transform.ScaleX = transform.ScaleY = 1;
            transform.TranslateX = transform.TranslateY = 0;
        }

        private void OnHold(object sender, GestureEventArgs e)
        {
            transform.TranslateX = transform.TranslateY = 0;
            transform.ScaleX = transform.ScaleY = 1;
            transform.Rotation = 0;
        }

        /*ドラッグで画像を移動させています。*/
        private void OnDragDelta(object sender, DragDeltaGestureEventArgs e)
        {
            transform.TranslateX += e.HorizontalChange;
            transform.TranslateY += e.VerticalChange;
        }

        /*ピンチアウトする前にサイズを保存しておきます、コメントアウトを外すと回転もできます。*/
        private void OnPinchStarted(object sender, PinchStartedGestureEventArgs e)
        {
            //initialAngle = transform.Rotation;
            initialScale = transform.ScaleX;
        }

        /*ピンチアウト中ですね、倍率を見て拡大しています。コメントアウトを外すと回転もできます。*/
        private void OnPinchDelta(object sender, PinchGestureEventArgs e)
        {
            //transform.Rotation = initialAngle + e.TotalAngleDelta;
            transform.ScaleX = transform.ScaleY = initialScale * e.DistanceRatio;
        }
    }
}

これで、こんな風に画像が動かせるようになりましたね。

今回のImagePage.xamlの編集は以上です。
次回からはMainPage.xamlを触っていきます。

東京国際交流館

東京国際交流館に閉じ込められています。
というか、インタラクション学会に行ってたのに、未来館の天井が落ちるほどの地震で、いまここに避難しています。

テレコムセンターから煙が出たり、目の前で未来館の天井が落ちたりひどかったです。

というわけで、いつ関西に返ってこれるかしら。
あと、教授が残念なお知らせを先に教えてくれたので、今後の身の振り方も考えなくては。。。

Windows Phone 7 のはてなフォトライフビューワを作る (後編)その4ーDataBindingをタイルっぽく

サンプルデータをPanelにぽいっちょすると、ListBoxで一覧が表示されますよね。
今回はその辺のXAMLを編集して、タイルっぽく見せようと思います。
伊勢さんが用意してくれた最初の画面はこんなかんじですね。

newPhotoListBox選択して右クリック、現在のテンプレートを編集を選択します。
すると、Bindingされたデータのレイアウトを編集することができます。

まずは画像のサイズをそれっぽくしましょう。
200*200にして、StretchをUniformToFillにします。

次にタイトルの位置を画像と重ねるように調整します。
スタックパネルでコントロールが縦積みになっているので、マージンで調整します。
今回は、Margin="5,-27,0,0"で調整してみました。

この文字のOpacityを0.7にして、文字色をPhoneAccentColorにしてみました。
あとWidth="195"としておくと、タイトルが長すぎることはなくなります。

あとはこれを包んでいるStackPanelにMargin="10"を入れておきます。

しかし、このままだと、画像が縦に並んでるだけで、WP7のタイルっぽくないですね。
次に画像を2列に並べてみましょう。
newPhotoListBoxを右クリックで選択して、ItemsPanelを選択します。

次の画面はOKでいいでしょう。

すると、オブジェクトパネルにStackPanelが置かれています。

このStackPanelをtoolkitのWrapPanelに変えます。
直接XAMLをいじってもいいですし、StackPanelを削除してからWrapPanelをおいてもいいでしょう。
すると、2列になりますね。

で、パネルをもう少し右に置きましょう。
HorizontalAlignmentをRightにします。

で、ビルドしてみましょう。
どうでしょう?タイルっぽくなったんじゃないでしょうか?