日別アーカイブ: 2009年1月4日

HTC Touch Diamond タッチセンサー API

Touch Diamond には、触れただけで反応するタッチセンサーが付いています。
ボタンやカーソルキー周りがそうです。

このタッチセンサーの値を受け取るには HTCAPI.dll を呼び出します。
ウィンドウに関連付けされ、あとはモードを設定するだけでメッセージ (WM_USER~)
で通知が来るようです。
参考にさせていただいたのは加速度センサーの読み出し同様こちらです。

Scott’s Weblog Fun with the Diamond’s tilt sensor

タッチセンサーは左右に分かれており、それぞれ個別に座標値が取れます。

・中央のカーソルキーから左側、通話ボタンやホームボタン側
・中央のカーソルキーから右側、終了ボタンや ← (OK) ボタン側

座標値は左上が原点 (0,0) で、0~67 くらいの範囲。
ただし中央のカーソルキー周囲は回転のジェスチャーとして識別されるため座標が
取れません。

中央の決定ボタンは、座標が不正な範囲 (255,255) の状態で押されることで
判別できます。カメラのオートフォーカスで半押し状態がこれ。

タッチしたイベント (DOWN) と指を離したイベント (UP) が送られてくるだけで、
MOVE イベントがありません。押した座標、離した座標は取れますが、移動中の
イベントがないのでスライドによるスクロールなどには向いていないようです。

液晶面の感圧式タッチパネルだとスクロール等のスライドを指で行うのが
難しかったりするので、本当ならこちらのタッチセンサーでスクロールできたら
よかったのですが。

また左右のパネル両方同じイベント扱いなので、どちらかにタッチしてしまうと
DOWN 状態になります。座標は独立して取れるものの状態が共有なので、
マルチタッチのような使い方にも向いていないようです。

なお液晶面のタッチパネルとは別物なので、タッチボタンと液晶画面など別センサー
同士の同時タッチは可能です。

HTCNavClose() の引数は DWORD ではなく、HWND が正しいようです。
よって HTCNavSetMode() で与えた DWORD を Close() するのではなく、使い方としては
HTCNavOpen() に与えた HWND を指定して一度だけ Close() します。

中央の回転ジェスチャーは WM_USER + 200 だけでなく WM_USER + 201 にも何らかの
データが送られています。終了イベントのようですが、送られないこともあります。

いろいろ試したけど生の値が取れる方法はまだわかりません。
とりあえずボタン部分に触れただけで反応するような感度の良いアプリは作れると
思います。

同じ部分に指を置いても

(1) 触れる → タッチセンサー
(2) 押し込み → ボタン
(3) 触れたまま揺らす → 加速度センサー

といった使い分けもできるでしょう。

関連エントリ
HTC Touch Diamond のボタン部分とタッチセンサー
HTC Touch Diamond の加速センサー