マルチタッチ入力による図形の描画

2010年10月29日(金)
PROJECT KySS

XMLデータを利用した、2点タッチの占い

今度は、最初のサンプルに、XMLデータを絡めたサンプルを作成してみましょう。

作成するのは、タッチした2点間の距離によって、メッセージを表示する、名付けて「二人でタッチ!」というサンプルです(図5)。

処理は単純です。ただ、心にとめていただきたいのは、携帯端末と異なり、大きな画面ならば複数の人がタッチできるということです。「ユーザーを一人に限定しない」企画が可能になるのです。極論すれば、ユーザーは、人とペットの猫や犬でもいいのです。

図5:二人で同時にタッチすると、その距離感から、二人へのメッセージが表示される(クリックで拡大)

では、サンプルを作成していきましょう。

WPFアプリケーションの新規プロジェクト(ここでは「WPF_touch3」プロジェクト)を作成します。

MainWindow.xamlのソースを開き、MainWindowのHeightは800、Widthは1000、先と同様、コントロールをダブルクリックして1個レイアウトし、Heightは700、Widthは800としておきます。

メッセージは、XML文書に記述しておき、LINQ to XMLで読み込んで表示させます(リスト6)。このXML文書ファイルは、プロジェクト内のbin/Debugフォルダの中に、dataサブフォルダを作成して置いてください。ダウンロード・ファイルには追加済みです。

リスト6 表示するメッセージを記述したXML文書(touchMessage.xml)

01<!--//--><![CDATA[// ><!--
02 
03<?xml version="1.0" ?>
04<touchMessages>
05  <result>
06    <level>0
07    <message>距離が近過ぎるかもしれません。自他境界は明確に。
08   
09  <result>
10    <level>200
11    <message>近過ぎず、遠過ぎず、よい距離感です。
12   
13~400~1000の<level>のデータ、略~
14 
15 
16//--><!

また、画面にタッチした際に表示させる2枚の画像は、Expression Designで作成し、png形式を指定してエクスポートしたものを使います。これらの画像ファイルは、bin/Debugフォルダの中に、pngImagesサブフォルダを作成して置いてください。これらもダウンロード・ファイルには追加済みですが、「素材」フォルダ内にもありますので、1から開発する際に利用してください。

データと画像の準備ができたところで、処理を記述していきます(リスト7)。

距離を計算させるため、Imports System.Math名前空間を読み込んでおきます。

画面がタッチされた時、2色の図形を表示します。そして、タッチした2点間のX座標値の差と、Y座標値の差をそれぞれもとめ、2点間の距離をもとめます。XML文書ファイルを読み込んでおき、この距離とXMLデータの要素の値を照合し、該当する要素の内容を表示します。

メッセージが表示された後は、Canvasをクリアし、再度タッチを受け付けます。

リスト7 「二人でタッチ!」のロジック・コード(MainWindow.xaml.vb)

01<!--//--><![CDATA[// ><!--
02 
03Imports System.Math
04 
05Class MainWindow
06  Dim no As Integer = 0
07  Dim x1, x2, y1, y2 As Double
08 
09  Private Sub Canvas1_TouchDown(ByVal sender As System.Object, ByVal e As System.Windows.Input.TouchEventArgs) Handles Canvas1.TouchDown
10 
11    no = no + 1
12 
13    Dim myRectangle As New Rectangle
14    myRectangle.Width = 400
15    myRectangle.Height = 400
16 
17    Dim touchPoint = e.GetTouchPoint(Canvas1)
18 
19    Dim myBrush As New ImageBrush()
20    If no Mod 2 = 1 Then
21 
22      myBrush.ImageSource = New BitmapImage(New Uri("pngImages\heart_pink.png", UriKind.Relative))
23 
24      myRectangle.Fill = myBrush
25      x1 = touchPoint.Position.X
26      y1 = touchPoint.Position.Y
27    ElseIf no Mod 2 = 0 Then
28 
29      myBrush.ImageSource = New BitmapImage(New Uri("pngImages\heart_green.png", UriKind.Relative))
30      myRectangle.Fill = myBrush
31      x2 = touchPoint.Position.X
32      y2 = touchPoint.Position.Y
33    End If
34 
35    myRectangle.RenderTransform = New TranslateTransform(touchPoint.Position.X - 200, touchPoint.Position.Y - 200)
36 
37    Canvas1.Children.Add(myRectangle)
38 
39    If no Mod 2 = 0 Then
40      calc()
41    End If
42 
43  End Sub
44 
45  Sub calc()
46 
47    Dim xDistance As Integer = Abs(CInt(x1 - x2))
48    Dim yDistance As Integer = Abs(CInt(y1 - y2))
49    Dim distance As Integer = CInt(Sqrt(xDistance ^ 2 + yDistance ^ 2))
50 
51    Dim xmldoc As XElement = XElement.Load("data/touchMessage.xml")
52    Dim query As IEnumerable(Of XElement) = From c In xmldoc.Elements("result") Select c
53    For Each result In query
54      Dim level As Integer = CInt(result.<level>.Value)
55      If distance >= level AndAlso distance < level + 200 Then
56        MessageBox.Show(result.<message>.Value)
57        Canvas1.Children.Clear()
58        no = 0
59      End If
60    Next
61  End Sub
62End Class
63 
64//--><!

マルチタッチ利用上の注意点

一見便利なマルチタッチですが、何でもタッチ操作にすればよいわけでもなく、逆に、タッチ操作だからこそ生きるコンテンツもあります。マウス操作でクリックした場合と、指でタッチした場合で、インパクトが異なるようなインタフェースを考えなければなりません。そうでなければ、画面上を直接タッチすることによるメリットは薄くなります。

図6は、2009年の旧筆者サイトのメニューページで、シングルタッチを前提としたUIデザインです。タッチしたノードから枝が伸びて検索キーが確定していくインタフェースを、Silverlight 3アニメーションで実装しています。

図6:昨年度の筆者サイト。シングルタッチを前提としたUIデザイン

また、ビジュアル・デザインにも十分に注意する必要があります。マウス操作の延長線上で、デザインを企画しない方がよいでしょう。タッチインタフェースの操作性は、画面サイズにも左右されます。携帯端末の画面と、画面の小さいノートパソコン、デスクトップパソコンで使う21インチ以上のディスプレイや、ユーザーの体格によって操作性は大きく異なります。アクセシビリティについても、これまで以上に考えなければなりません。

次に、いくつかの検討事項をあげてみます。

1)対象ユーザーによって、接触面積が異なります。児童の小さな指と、女性の伸ばした爪、成人男性の指では、操作性が異なります。接触面積が多ければ、ボタンも大きく、隣接するボタンとの距離も空ける必要があるでしょう。共通化するならば、スタイラス代わりのもので操作するようメッセージを表示しておく必要があります。

デスクトップPC用のディスプレイを基準とし、成人の指での単純なシングルタッチを前提とするWebサイトを作成するなら、ボタンの直径は100pixel以上、ボタン間の距離は15pixel以上必要でしょう。

2)ボタンやスクロールバーなど操作のためのツールは、できるだけ1~2か所にまとめてレイアウトした方がよいでしょう。マウスなら1cmも動かせば、ディスプレイの両端にある部品をポイントできます。しかし、タッチでは、腕を動かさなければなりません。ボタンが画面上に散在していると、操作性が低下します。特に、右上と左上に、小さなボタンをレイアウトし、両方を往復しなければならないレイアウトは避けた方がよいでしょう。

3)デスクトップPC用のディスプレイでは、スクロール幅が大きい場合は、縦スクロールよりも、横スクロールの方が、操作しやすい場合もあります。スクロールバーを操作させるのではなく、ボタンのクリックにより次ページを表示するようなレイアウトの方がよい場合もあります。

以上、この4回の連載では、外部機器から入力された信号の処理について紹介してきました。

マウスは画期的で優れたインタフェースでしたが、皮膚と脳は同じ外胚葉(はいよう)から分化するので、装置を通さず指で直接触れる方が、ヒトのインタフェースとしては自然だといえるかもしれません。

また、センサーについても、脳波ほか、人が思考するだけで制御できるもの(ブレーン・マシン・インターフェース)も続々と開発されています。

これからのRIAには、「人がそこにいるだけでよい」、ヒト自身がデバイスになるインタフェース設計がもとめられるようになるのは明らかです。

この4回の連載で、これまで外部機器には無縁なフィールドで作業をしていたWebサイト制作者の皆さんに、外部機器を使ってみようかな、という気持ちが芽生えたなら、本連載企画は役割を果たしたといえるでしょう。

なお、Microsoft社のデバイスに関する情報は、次のURLを参照してください。

参照リンク→「デバイスの基礎(マイクロソフト)」

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています