ここまでできる!
WindowsPhone7!
すまべん関西&Androidの会関西支部 共同開催
2010/09/25
tmyt
こんにちは!
• tmyt/つもゆた っていいます。
• だいたい大学院生をやっています。
• WindowsMobileシリーズに一途です。
 • 先日iPhone/iPad持ってないのでdisられました。
• Azureaとか作ってます。
• C++担当です。
• ARMのアセンブラは一般教養です!
本日のお題
• ついにRTMされたWindowsPhone7!
• そしてSDKも先週RTWされましたね!

• でも気になるのは結局なにができるの?
 • Silverlightだからこそできる!を中心に見ていきましょう!
最初からネガティブな話題で申し訳ないので
すが…
WindowsPhone7でできなくなったこと
•   タスクを並列して2個以上同時に実行すること
•   ネイティブコードを実行すること
•   実行中にコードを書き換えること
•   変数に代入した機械語を実行すること
•   他人のプロセスをフックしていろいろすること
•   ファイルシステムへアクセスすること
•   システムDLLをP/Invokeしていろいろすること

• などなど。変態的なことは基本的にできません
現時点でできないこと
• 日本語入力
 • これ重要。
 • 日本人からするとただこの一つに尽きます
  • 解決策を後ほど…
• エミュレータ上でのLiveIDの設定
• エミュレータ上でのメールアカウントの設定
じゃぁできるようになったことは・・・?
できるようになったこと
•   加速度センサへのアクセス
•   DeepZoomの利用
•   4点以上のマルチタッチ
•   Silverlightを使用したアプリケーション開発
•   PushNotificationの利用
•   統合されたロケーション情報へのアクセス
従来のWindowsMobileとの違い
•   外部の情報へのアクセスにTaskを使用
    •   写真を撮るも開くも、アドレス帳から選択してくるのもみんな同じ
        手順で利用可能に
•   タスクが殺される前にコンテキストの保存をしないといけなく
    なった
•   開発がSilverlightになったのでXAMLをいじらないといけなく
    なった
•   XNAが使えるようになった
    •   Silverlight+XNAのキメラもできます!
新しくなったユーザインターフェース
• PivotやPanoramaといったMetro UI
 • もちろんユーザアプリケーションも利用できます
• Hubからはじまるオペレーション
 • People,Game,Music+Video,Photo,Office…
• シンプルで大きなコントロール
新しくなった開発フロー
• Blendでデザイン
 • UIの配置
 • アニメーションの作成
• VisualStudioでコードの実装
• アプリケーションのデバッグ
• マーケットプレイスへの配信
開発する上での注意
•   XAPは400MBまで
•   マーケットプレイスを経由していないアプリケーションは10個まで
•   UIスレッドをブロックするコードは書けません
•   Unlockできる端末は3台まで
•   Etc…
コードで比較してみます

UIの実装が圧倒的に楽になりました
某アプリケーションのこれ
C++だとこんなかんじ
Blendでかくとこう
文字が読める!!
すばらしいですね!!
Blendすばらしいですね
• あのUIがコードを1行も書かずに実現できます
• Silverlightすごいですね
• では次からはTaskやPanoramaなどを実例を交えて紹介します
使用例1

様々なTask
いろいろなものを開くTask
• アプリケーションからデータにアクセスする場合はTaskを経由しなけれ
  ばなりません。
• Taskはこんなのが用意されています
 •   CameraCaptureTask
 •   EMailAddressChooserTask
 •   EmailComposseTask
 •   MarketplaceDetailTask
 •   MarketplaceSearchTask
 •   PhoneCallTask
 •   PhoneNumberChooserTask
 •   PhotoChooserTask
 •   SaveEmailAddressTask
 •   SavePhoneNumberTask
 •   SearchTask
 •   SmsComposeTask
 •   WebBrowserTask
Taskを使用する際の注意点
• Taskを呼び出すにはShow関数を呼びます
• Taskを呼び出すと自分のアプリケーションは終了されます
• Taskから帰ってくると自分のアプリケーションが再度起動します。
 • その際にCompletedイベントにハンドラを設定した直後にハンドラ
   が呼び出されます。
 • Loadedイベントでイベントハンドラを設定するのがおすすめ
• エミュレータで実行するとタスクから戻ってくると30秒程度待ち
  時間があるのでその間にデバッグを再度実行しましょう
CameraCaptureTask
•   カメラを起動して画像を入力
•   WMでいうところのCameraCaptureDialog
•   C++だとSHCameraCapture
•   撮影した写真は保存されません
EMailAddressChooserTask
• アドレス帳からメールアドレスを選択します
EmailComposseTask
• Emailを新規作成します
• 送信先や、件名、本文などを設定できます
• エミュレータで動作しないので詳細をチェックできてません
MarketplaceDetailTask
• マーケットプレイスで指定した製品の詳細情報を呼び出します
• 動作確認する方法が現時点で無いので試していません
MarketplaceSearchTask
• マーケットプレイスを検索します。
• これもLiveIDを設定できないので試せません。
PhoneCallTask
• 指定した番号へ電話をかけます。
• 左図のような確認画面がでます。
PhoneNumberChooserTask
• アドレス帳から電話番号を選択します。
• 選択後PhoneCallTaskを使って電話をかけたりします
PhotoChooserTask
• 保存されている画像ファイルを読み込むために使用します
SaveEmailAddressTask
• Emailアドレスをアドレス帳に保存します
SavePhoneNumberTask
• 電話番号をアドレス帳に保存します
SearchTask
• OS標準のWeb検索を呼び出します
• 検索文字列を任意に設定できます
SmsComposeTask
• SMSを作成します
 • auでいうCメール、Docomoのショートメールですね
WebBrowserTask
• Webブラウザを起動します
• URLを指定するとそのURLを開いてくれます
使用例2

Pivot/Panorama
Pivot
• WMでいうところのタ
  ブコントロールのような
  もの
• タブページ間に強い
  つながりが無い場合
  に使う
• 左右フリックでページ
  切り替え
• かっこいい
Panorama
• Pivotよりページ間の
  つながりが強い
• ページは1枚の大きい
  横長の一部が表示さ
  れる
• フリックでゆるやかに
  ページ切り替え
• かっこいい
使用例3

ロケーション
WMでのロケーション
• GPSのみ
• Intermidiate Driverが仮想化してくれていた
• 基地局測位は自分でがんばるしかない
 • PHSだとCOM叩きますよね
 • 3GだとRILのCE向けAPIを叩きます
    • 叩いた後GoogleのAPIとかに投げると経度緯度に変換してくれたり
• いろいろ大変でした。
WP7でのロケーション
• とても楽になりました。
• .NET 4のロケーションAPIと互換
    • つまりWindows7のロケーションAPIと互換
•   GPSを扱えます
•   基地局測位もあつかえます
•   Wifi測位も使えるかもしれません
•   全部まとめて1つのインターフェースで提供されます

• 位置検出デバイスを指定できないのがちょっと残念
コードで書くとこんな感じ
 public partial class Location
  {
     GeoCoordinateWatcher geo;
     public Location()
     {
        geo = new GeoCoordinateWatcher();
        geo.PositionChanged += new
EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(g
eo_PositionChanged);
     }

    void geo_PositionChanged(object sender,
GeoPositionChangedEventArgs<GeoCoordinate> e)
    {
      // いろいろ
    }
  }
使用例4

DeepZoom
DeepZoomって?
• Deep Zoom は、高解像度のイメージをインタラクティブに表示
  できる機能です。アプリケーションのパフォーマンスに影響を及
  ぼさずにすばやく、イメージをズームインしたりズームアウトしたり
  できます。Deep Zoom では、複数解像度のイメージを用意し、
  スプリング アニメーションを使用することによって、滑らかな読
  み込みとパンを可能にしています。
 • http://msdn.microsoft.com/ja-jp/library/cc645050(VS.95).aspx
• つまりGoogleMapのWebみたいなのをやるコントロールです
とりあえず使ってみる
•   Deep Zoom Composerで画像を分割、XMLを生成
•   VSのプロジェクトに追加
•   MultiScaleImageコントロールを配置
•   Sourceにxmlのパスを設定

• とりあえずこれだけ書けば使えます。
動的に画像をダウンロードする…?
• 画像キャッシュを自分で書かなくていい
 • らくちん!
• 解像度に応じた画像を動的にダウンロードするってどこかで聞
  いたような・・・
これですね!
MultiScaleTileSource
• MultiScaleImageにXMLを指定した場合、DeepZoom用に生
  成したXMLでないとエラーになりました。
• さっきのアプリはもちろんDeepZoom用にXMLは作られていま
  せん
• このクラスを実装したクラスをImageSourceに指定することで
  画像のダウンロードをカスタマイズできます
使用例5

マルチタッチ
WP7のマルチタッチ
• Silverlightのマルチタッチです。
• つまりWindows7のマルチタッチと互換です。
• Touch.FrameReported イベントにハンドラを書いておくとマル
  チタッチイベントが捕捉できます。
• ピンチイン・ピンチアウトの検出などの気の利いた機能はありませ
  ん
 • 自分で書きましょう
マルチタッチできるなら!
• やるしかないですよね!
 • すこし時代遅れ感がありますが・・・
使用例6

Silverlght+XNA
XNAのクラスをSilverlightから
• XNAのクラスをSilverlightから呼べます!
• 深く叩いたわけではないのでどこまで呼べるかちょっとわかりま
  せんが…
そんなのいつ使うんだ!
• Silverlightで動的にWaveを生成して再生したいときですよ
• たとえばこんなとき。
実はあのアプリ
• RIFFヘッダとか動的に生成してます
• Sinウェーブも動的生成です。
• つまりWaveファイルを動的にメモリ上に構築してXNAで再生し
  ています

•あほです
使用例7

日本語入力を実現してみる
日本人の最大の悩み
• そう、それは、日本語入力
 • WMではATOKとかインストールしてましたね
• Windows Phone 7では日本での発売が未定なのもあるのか
  IMEは実装されていません
 • 今後実装されるでしょう!
• でもいま日本語入力が使いたい!とおもうのはしかたないこと。
• 悲しくも僕たちはデベロッパなのでIMEを作るかという発想にい
  たるわけです…
id:iseebiがやらかした
• 22:29:08 <iseebi> つもりん、AjaxIME実装した?
• 02:24:55 <iseebi> できたあああ

• たった4時間でid:iseebiがやってくれました。
これがそれ
せっかくなので
• コントロールにしました。
• 組み込むだけで日本語入力が使えます!
こんなかんじ
実装
• 裏でSocialIMEを叩いてます
• 文節の調整はサポートしてません
 • だれかやって!
• エディットコントロールが2枚重なってます
• ローマ字変換は自前のテーブルです!
• http://d.hatena.ne.jp/tmyt/
 • ここで配布してます!
かけあしで見てきましたが
• WindowsPhone7はSilverlightでできることがほとんどすべてで
  きます
• 表現力もiOSやAndroidに負けないぐらい高まりました
• 国内の発売が楽しみですね!
ご清聴ありがとうございました

Sumaben#11