<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>ke-tai.org &#187; MultiTouch</title>
	<atom:link href="http://ke-tai.org/blog/tag/multitouch/feed/" rel="self" type="application/rss+xml" />
	<link>http://ke-tai.org/blog</link>
	<description>ke-tai.org　ケータイプログラマのためのコミュニティサイト。携帯電話向けWeb開発の技術情報を扱っています。</description>
	<lastBuildDate>Tue, 31 Jan 2012 13:30:51 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://ke-tai.org/blog/tag/multitouch/feed/" />
		<item>
		<title>90秒で理解するiPhone JavaScript（マルチタッチ編）</title>
		<link>http://ke-tai.org/blog/2008/07/28/iphonemulti/</link>
		<comments>http://ke-tai.org/blog/2008/07/28/iphonemulti/#comments</comments>
		<pubDate>Mon, 28 Jul 2008 13:05:45 +0000</pubDate>
		<dc:creator>matsui</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[iPod Touch]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[MultiTouch]]></category>
		<category><![CDATA[マルチタッチ]]></category>

		<guid isPermaLink="false">http://ke-tai.org/blog/?p=386</guid>
		<description><![CDATA[仕事でiPhone向けサイトを作ることになるかもしれず、色々と調査中です。 まずはiPhoneならではの機能ということで、マルチタッチについて調べてみました。 ここまでわかったことをメモ代わりに記載したいと思います。 今 [...]]]></description>
			<content:encoded><![CDATA[<p>仕事でiPhone向けサイトを作ることになるかもしれず、色々と調査中です。</p>
<p>まずはiPhoneならではの機能ということで、マルチタッチについて調べてみました。<br />
ここまでわかったことをメモ代わりに記載したいと思います。</p>
<p>今回はひとまず座標の取得までです。<br />
ゆくゆくは、こちらのムービーのように凝ったギミックを作りこみたいと思っています。</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/-XKb8We_uzg&#038;hl=ja&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.youtube.com/v/-XKb8We_uzg&#038;hl=ja&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p class="spacer-small">&nbsp;</p>
<p>マルチタッチの座標を取得するのは思ったより簡単で、抑えるポイントは4つだけです。</p>
<ol>
<li>Safari自体のスクロールや拡大・縮小は動作しないようにした方が無難</li>
<li>タッチのイベントは、リスナーまたは「onTouchXXX」から取得</li>
<li>タッチ数は「event.touches.length」で取得</li>
<li>座標は「event.touches[i].pageX (or pageY)」で取得</li>
</ol>
<p class="spacer-small">&nbsp;</p>
<p><strong>1. Safari自体のスクロールや拡大・縮小は動作しないようにした方が無難</strong></p>
<p>マルチタッチを行う前の下準備として、Safari自体のスクロールや拡大・縮小を、動作しないようにしておいた方が無難です。</p>
<p>対象をドラッグしようとしているのか、画面をスクロールしようとしているのか、プログラム側で判断するのは難しいためです。<br />
今回は次のように調整しました。</p>
<p class="super-pre-small">&lt;meta name=&#8221;viewport&#8221; content=&#8221;width=480, user-scalable=no, maximum-scale=0.6667&#8243; /&gt;</p>
<p><small>横スクロールと拡大・縮小を禁止しています。　→　<a href="http://ke-tai.org/blog/2008/07/15/cssiphone/" target="_blank">参考エントリ</a></small></p>
<p>縦スクロールは、「<strong>event.preventDefault();</strong>」で抑止できるようです。<br />
（後述のサンプルプログラム内でご確認ください）</p>
<p class="spacer-small">&nbsp;</p>
<p><strong>2. タッチのイベントは、リスナーまたはonTouchXXXから取得<br />
</strong></p>
<p>タッチ関連のイベントには</p>
<ul>
<li>onTouchStart</li>
<li>onTouchMove</li>
<li>onTouchEnd</li>
<li>onTouchCancel</li>
</ul>
<p>の4つがあり、それぞれonClick()などと同じような形で、イベントを取得できます。</p>
<p>またリスナー方式の場合は、</p>
<pre class="super-pre-small"><code>document.addEventListener("touchstart", touchHandler, false);
document.addEventListener("touchmove", touchHandler, false);
document.addEventListener("touchend", touchHandler, false);
document.addEventListener("touchcancel", touchHandler, false);
</code></pre>
<p>のような形で利用します。<br />
touchcancelはどのようなケースで使われるのかは不明です。<br />
もしご存じの方がいましたら教えてください。</p>
<p class="spacer-small">&nbsp;</p>
<p><strong>3. タッチ数は「event.touches.length」で取得</strong></p>
<p>これは簡単です。<br />
タッチ情報は「event.touches」に配列の形で格納されますので、その数を見ればOKです。<br />
（event変数が何かについては、後述のサンプルプログラムでご確認ください）</p>
<p class="spacer-small">&nbsp;</p>
<p><strong>4. 座標は「event.touches[i].pageX (or pageY)」で取得</strong></p>
<p>タッチ座標は「event.touches[i].pageX」のような形で取得します。<br />
シングルタッチの場合は「event.touches[<strong>0</strong>].pageX」。<br />
ダブルタッチの場合は、上記に加え「event.touches[<strong>1</strong>].pageX」にも値がセットされます。<br />
最大5個（touches[4]）まで機能するようです。</p>
<p class="spacer-small">&nbsp;</p>
<p>サンプルプログラムは下記の通りです。</p>
<pre class="super-pre-small"><code>&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
&lt;meta name="viewport" content="width=480, user-scalable=no, maximum-scale=0.6667" /&gt;
&lt;script type="text/javascript" charset="utf-8"&gt;
&lt;!--
// 初期化
function init() {
	document.addEventListener("touchstart", touchHandler, false);
	document.addEventListener("touchmove", touchHandler, false);
	document.addEventListener("touchend", touchHandler, false);
}

function touchHandler(event) {
	// タッチ数を取得
	document.getElementById("touchnum").innerHTML = event.touches.length;

	// タッチ位置を取得
	for (var i = 0; i &lt; 5; i++) {
		if (event.touches[i]) {
			// 座標をセット
			document.getElementById("loc" + i + "_x").innerHTML = event.touches[i].pageX;
			document.getElementById("loc" + i + "_y").innerHTML = event.touches[i].pageY;
		} else {
			document.getElementById("loc" + i + "_x").innerHTML = '';
			document.getElementById("loc" + i + "_y").innerHTML = '';
		}
	}

	event.preventDefault();
}
// --&gt;
&lt;/script&gt;
&lt;/head&gt;

&lt;body onLoad="init();"&gt;

タッチ数: &lt;span id="touchnum"&gt;&lt;/span&gt;&lt;br /&gt;
タッチ0: X:&lt;span id="loc0_x"&gt;&lt;/span&gt;, Y:&lt;span id="loc0_y"&gt;&lt;/span&gt;&lt;br /&gt;
タッチ1: X:&lt;span id="loc1_x"&gt;&lt;/span&gt;, Y:&lt;span id="loc1_y"&gt;&lt;/span&gt;&lt;br /&gt;
タッチ2: X:&lt;span id="loc2_x"&gt;&lt;/span&gt;, Y:&lt;span id="loc2_y"&gt;&lt;/span&gt;&lt;br /&gt;
タッチ3: X:&lt;span id="loc3_x"&gt;&lt;/span&gt;, Y:&lt;span id="loc3_y"&gt;&lt;/span&gt;&lt;br /&gt;
タッチ4: X:&lt;span id="loc4_x"&gt;&lt;/span&gt;, Y:&lt;span id="loc4_y"&gt;&lt;/span&gt;&lt;br /&gt;

&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p class="spacer-small">&nbsp;</p>
<p><a href='http://ke-tai.org/blog/wp-content/uploads/2008/07/20080728_1.jpg'><img src="http://ke-tai.org/blog/wp-content/uploads/2008/07/20080728_1-150x150.jpg" alt="" title="20080728_1" width="150" height="150" class="alignnone size-thumbnail wp-image-388" /></a><br />
<small>このような感じで座標が取得できます　（クリックで拡大）</small></p>
<p>実際にiPhone/iPodTouchをお持ちの方はこちらかお試しください。<br />
<a href="http://ke-tai.org/test/multitouch/multitouch.html" target="_blank">http://ke-tai.org/test/multitouch/multitouch.html</a></p>
<p>座標が取得できてしまえば、線を引くのも、画像を回転させるのも自由自在ですね。</p>
<p>とりあえず動作はしていますが、アップルの公式ドキュメントを読んで作ったわけではないので、もし間違っていたらご指摘をお願いします。</p>
<p>なお、今回のエントリー名には<a href="http://pha22.net/hotentry/" target="_blank">ホッテントリメーカー</a>を利用させていただきました。<br />
もし90秒で理解できなかったら（というか難しいですよね・・・）ご勘弁ください。</p>
<p class="spacer">&nbsp;</p>
<p><strong><em>関連：</em></strong></p>
<ul>
<li><em><a href="http://ke-tai.org/blog/2008/07/15/cssiphone/">CSSの変更だけでPCサイトをiPhoneに対応させる方法</a></em></li>
<li><em><a href="http://ke-tai.org/blog/2008/07/11/ihoneget/">ソフトバンクのiPhone3Gを買ってきました</a></em></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://ke-tai.org/blog/2008/07/28/iphonemulti/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://ke-tai.org/blog/2008/07/28/iphonemulti/" />
	</item>
	</channel>
</rss>

