Webアプリケヌションのマルチタッチ開発

通垞、スマヌトフォンやタブレットなどのモバむルデバむスには、ナヌザヌ゚クスペリ゚ンスを向䞊させるための静電容量匏タッチセンシティブスクリヌンがありたす。



毎日、モバむルアプリケヌションはたすたす困難になっおいたす。 Web開発者は、タッチスクリヌンのすべおの機胜を䜿甚するためのAPIも必芁です。 たずえば、䞀郚のアヌケヌドゲヌムや栌闘ゲヌムでは、いく぀かのボタンを抌す必芁がありたす。この機胜は、マルチタッチをサポヌトする画面を提䟛できたす。



AppleはiOS 2.0でタッチむベントAPIを導入したしたが、すぐにAndroidデバむスもこの機䌚を埗お、タッチむベントAPIは事実䞊の暙準になりたした。 W3Cワヌキンググルヌプは最近、 タッチむベント仕様に取り組むために組み立おられたした。

この蚘事では、iOSおよびAndroidデバむスが提䟛するタッチむベントAPIを怜蚎し、タッチむベントAPIを䜿甚しお䜜成できるアプリケヌションを孊習したす。 この蚘事には、タッチむベントAPIを䜿甚しおアプリケヌションを簡単に䜜成できる䟿利な䟋ずテクニックが数倚くありたす。



むベント



これらの3぀の䞻芁なむベントは仕様に瀺されおおり、倚くのデバむスでサポヌトされおいたす。

touchstart DOM芁玠にタッチしたすmousedownに類䌌。

touchmove DOM芁玠に沿った指の動きmousemoveに類䌌。

touchend DOM芁玠で削陀された指アナログマりスアップ。



各むベントには、タッチポむントの3぀のリストフィンガヌリストが含たれたす。

touches 画面䞊のすべおのタッチポむントのリスト。

targetTouches 珟圚の芁玠のポむントのリスト。

changedTouches 珟圚のむベントに参加しおいる指のリスト。 たずえば、touchendむベントでは、これは削陀された指です。



リストの各芁玠は、次の圢匏のオブゞェクトです。

identifier 珟圚画面䞊にある指の䞀意の識別子

target むベントの目的であるDOM芁玠

クラむアント/ペヌゞ/画面座暙  画面䞊でむベントが発生したポむント

radiusずrotationAngle 指の圢を衚す楕円



タッチアプリ



touchstart、touchmove、およびtouchendむベントは、ズヌム、回転などの通垞のマルチタッチゞェスチャを含むタッチベヌスの察話を䜜成するための匷力なAPIを提䟛したす。



この䟋では、シングルポむントタッチを䜿甚しおDOM芁玠をドラッグできたす。

var obj = document.getElementById('id'); obj.addEventListener('touchmove', function(event) { //  1    if (event.targetTouches.length == 1) { var touch = event.targetTouches[0]; // Place element where the finger is obj.style.left = touch.pageX + 'px'; obj.style.top = touch.pageY + 'px'; } }, false);
      
      





以䞋は、画面䞊のすべおのタッチを衚瀺する䟋です。

画像

画像はクリック可胜です

圌のコヌドは次のずおりです。

 //    canvas canvas.addEventListener('touchmove', function(event) { for (var i = 0; i < event.touches.length; i++) { var touch = event.touches[i]; ctx.beginPath(); ctx.arc(touch.pageX, touch.pageY, 20, 0, 2*Math.PI, true); ctx.fill(); ctx.stroke(); } }, false);
      
      





デモ


倚数のマルチタッチアプリケヌションがすでに登堎しおいたす。そのうちの1぀は、Paul Irishによっお䜜成されたキャンバスベヌスの描画ツヌルです。

画像



Browser Ninjaデモは、CSS3倉換、トランゞション、キャンバスを䜿甚したFruit Ninjaクロヌンです。

画像



重芁なポむント



ズヌム防止


デフォルト蚭定はマルチタッチにはあたり適しおいたせん。倚くの堎合、モバむルブラりザは、指の動きをズヌムたたはスクロヌルのコマンドずしお認識したす。



ズヌムを無効にするには、次のメタタグを割り圓おる必芁がありたす。

 <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
      
      





さらに埮調敎するには、 www.html5rocks.com / mobile / mobifying.htmltoc - meta - viewportのこの蚘事をご芧ください。



スクロヌル防止


䞀郚のモバむルデバむスには、iOSの叀兞的なオヌバヌスクロヌルなど、タッチムヌブゞェスチャのデフォルトの動䜜がありたす。これにより、スクロヌルが蚱容限床を超えた堎合にペヌゞが戻りたす。 これはマルチタッチアプリケヌションではわかりにくいですが、簡単に無効にできたす。

 document.body.addEventListener('touchmove', function(event) { event.preventDefault(); }, false);
      
      





慎重に描く


耇雑なマルチフィンガヌゞェスチャを含むマルチタッチアプリケヌションを䜜成する堎合は、倚くのむベントを受け取るため、泚意が必芁です。 すべおのタッチポむントが描画された前の䟋を考えおみたしょう。 次の方法で実行できたす。

 canvas.addEventListener('touchmove', function(event) { renderTouches(event.touches); }, false);
      
      





この方法は、画面䞊の指の数に比䟋したせん。 代わりに、ルヌプを䜿甚しおすべおの指を描画し、パフォヌマンスを倧幅に向䞊させるこずができたす。

 var touches = [] canvas.addEventListener('touchmove', function(event) { touches = event.touches; }, false); //  60fps timer = setInterval(function() { renderTouches(touches); }, 15);
      
      





setIntervalのタむマヌは、アニメヌションを䜜成するのに適した方法ではありたせん。 ブラりザの再描画サむクルず同期したせん。 最新のデスクトップブラりザヌはrequestAnimationFrame関数を提䟛したす。この関数は、アニメヌションのルヌプに適しおいたす-より効率的で、バッテリヌの消費が少なくなりたす。 最新のすべおのブラりザでサポヌトされるず、setIntervalの䜿甚は䞍適切な圢匏になりたす。



targetTouchesおよびchangedTouchesの䜿甚


event.touchesは、DOM芁玠に觊れる指だけでなく、画面に接觊しおいるすべおの指の配列であるこずを理解するこずが重芁です。 通垞、最も適切なのはevent.targetTouchesたたはevent.changedTouchesです。



最埌に、モバむルデバむス甚に開発しおいる堎合は、 Eric Bidelmanの蚘事ずW3Cのドキュメントで説明されおいる重芁なポむントを知っおおく必芁がありたす 。



デバむスのサポヌト



残念ながら、すべおのデバむスが適切な品質のタッチむベントをサポヌトしおいるわけではありたせん。 このデバむスたたはそのデバむスによるタッチAPIのサポヌト、およびタッチムヌブの粟床に関する情報を衚瀺する蚺断甚のスクリプトを䜜成したした 。 Nexus OneおよびNexus SでAndroid 2.3.3、XoomでAndroid 3.0.1、iPadおよびiPhoneでiOS 4.2をテストしたした。



䞀蚀で蚀えば、これらのブラりザヌはすべお、タッチスタヌト、タッチ゚ンド、およびタッチムヌブをサポヌトしおいたす。

仕様ではさらに3぀のむベントに぀いお説明しおいたすが、どのブラりザヌもそれらをサポヌトしおいたせん。

touchenter 指でDOM芁玠を入力したす。

touchleave 指はDOM芁玠から離れたす。

touchcancel 䞭断されたタッチ実装に䟝存。



テスト枈みのすべおのブラりザヌは、タッチリストtouch、targetTouches、changedTouchesも提䟛したす。 ただし、どのブラりザも指の圢状を決定するradiusX、radiusY、rotationAngleのいずれもサポヌトしおいたせん。



Touchmoveむベントは、テストされたすべおのデバむスで毎秒玄60回発生したす。



Android 2.3.3Nexus


Android GingerbreadブラりザヌNexus OneおよびNexus Sにはマルチタッチサポヌトがありたせん。 これは既知の問題です。



Android 3.0.1Xoom


Xoomブラりザはマルチタッチをサポヌトしおいたすが、1぀のDOM芁玠でのみ機胜したす。 ブラりザは、異なるDOM芁玠で2぀の䞊列むベントを正しく凊理できたせん。 ぀たり、次のコヌドは2぀の䞊列むベントを凊理したす。

 obj1.addEventListener('touchmove', function(event) { for (var i = 0; i < event.targetTouches; i++) { var touch = event.targetTouches[i]; console.log('touched ' + touch.identifier); } }, false);
      
      





しかし、これはそうではありたせん

 var objs = [obj1, obj2]; for (var i = 0; i < objs.length; i++) { var obj = objs[i]; obj.addEventListener('touchmove', function(event) { if (event.targetTouches.length == 1) { console.log('touched ' + event.targetTouches[0].identifier); } }, false); }
      
      







iOS 4.xiPad、iPhone


IOSデバむスは、Touch APIを完党にサポヌトしおいたす。



開発者ツヌル



モバむル開発では、コンピュヌタヌ䞊でプロトタむプを䜜成し、必芁に応じおラむブのモバむルデバむスを䜿甚しおテストする方が簡単です。 倚くのPCはマルチタッチをサポヌトしおいないため、マルチタッチは通垞のPCでテストするのが難しいこずの1぀です。



モバむルデバむスでのテストの必芁性は、開発サむクルを増加させる可胜性がありたす。 各倉曎をサヌバヌにアップロヌドしおから、デバむスにアップロヌドする必芁がありたすおおよそ、非垞に疑わしい難易床です。 モバむルデバむスには、必芁な開発者ツヌルがありたせん。



この問題の解決策は、PCでタッチむベントをシミュレヌトするこずです。 ワンポむントタッチはマりスでシミュレヌトできたす。 マルチタッチは、マルチタッチをサポヌトするデバむス、たずえば新しいApple MacBookでシミュレヌトできたす。



シングルポむントむベント


PCでワンポむントむベントをシミュレヌトする堎合は、ペヌゞ䞊のタッチむベントをシミュレヌトするPhantom Limbを詊しおください。



マりスずタッチむベントを組み合わせたjQuery甚のTouchableプラグむンもありたす。



マルチタッチむベントMACのみの゜リュヌション


マルチタッチデバむスApple MacBookたたはMagicPadを䜿甚しお、ブラりザヌでマルチタッチむベントを凊理できるようにしたす。 MagicTouch.jsを䜜成したした。これは、トラックパッドからむベントをキャッチし、暙準ず互換性のあるむベントに倉換したす。

開始するには

1.〜 / Library / Internet Plug-Ins /にnpTuioClient NPAPIプラグむンをダりンロヌドしおむンストヌルしたす。

2. MagicPad甹TongSeng TUIOアプリをダりンロヌドし、サヌバヌを起動したす。

3. MagicTouch.js JavaScriptラむブラリをダりンロヌドしお、暙準ず互換性のあるタッチむベントをシミュレヌトしたす。

4. magictouch.jsずnpTuioClientプラグむンを接続したす。

 <head> ... <script src="/path/to/magictouch.js"></script> </head> <body> ... <object id="tuio" type="application/x-tuio" style="width: 0px; height: 0px;"> Touch input plugin failed to load! </object> </body>
      
      







この方法はChrome 10でのみテストしたしたが、他の最新のブラりザヌでも動䜜するはずです。



お䜿いのPCがマルチタッチをサポヌトしおいない堎合、reacTIVisionなどの他のTUIOトラッカヌを䜿甚しおタッチむベントをシミュレヌトできたす。 詳现情報は、 TUIOプロゞェクトのWebサむトで入手できたす。



ゞェスチャはOSゞェスチャず重耇する堎合がありたす。 OS Xでは、 [システム環境蚭定]> [トラックパッド]でシステムむベントを蚭定できたす



マルチタッチむベントは、たすたす倚くのモバむルブラりザでサポヌトされおいたすが、新しいWebアプリケヌションがこのAPIを党面的に䜿甚しおいるこずを非垞に嬉しく思いたす。



翻蚳者から

元の蚘事ぞのコメントでは、リンクも滑りたした iPhoneでのタッチずゞェスチャヌ

提案、垌望、批刀は倧歓迎です



All Articles