« Unicode文字セット対応 | メイン | マルチタッチ実装中 »

2013年05月28日

吉里吉里Z 開発:: タッチイベント仕様について検討

    

マルチタッチ対応しているかどうかを取得するメソッド追加。
タッチイベントは有効化/無効化可能、イベントの TouchDown/Move/Up は別に作る。Clickは発生しない。
デフォルトで有効/無効はオプションにしてデフォルト有効。
有効化/無効化メソッドを行えるメソッドは別にあり。

これについて2種類の案をもらった。

1. onClick(マウスとタッチ両方で発生) onMouseDown(マウスで発生) onTouchEvent(タッチで発生)はどうか。
2. イベントオブジェクトに追加情報付ける。

2 の場合、onMouseDown/Up のボタンにタッチを追加。
onMouseMove の shift にフラグ追加。
マルチタッチ識別IDを引数に追加。
Clickあり。
と言う形か。

onClick は環境依存で問題も発生しやすく、確か LayerManager 辺りで down/click/up の順で発生しなければ不整合が発生したはず。
またクリックイベントは VCL の固有の機能。
そのため出来れば無くしていきたいが、マウスでのクリックではなくしづらい。
1 のケースでは、タッチ時クリックは無しにしたい。

2の案は互換性を保ち、新規機能も追加され良いように思えた。
が、マルチタッチ時のクリックはどうするのか?と言う問題に気付く。
指が離されるごとにクリックが発生するのか、最後の指が離されたときにクリックが発生するのか、それともクリックイベントは発生しないのか。

まず指が離されたときにクリックが発生すると、マルチタッチ時何度もクリックが発生することになる。
これは明らかに意図していない動作であろう。
最後に離されたときはどうか?
例えば CG モードでマルチタッチで拡大したいとする、CG モード時のクリックは次の CG へ切り換えとなっていることが多いが、この動作だと拡大して指離したと思ったら次の CG に切り替わって意図しない挙動をする。
シングルタッチやマウスのクリックでは次の CG に移って欲しいが、マルチタッチ時はそうなって欲しくない。
この様なことを考えるとマルチタッチ時はクリックイベントは発生しない仕様が良いように思える。

駅の券売機や ATM のタッチパネルでは、押した瞬間に反応する。
マウスは、多くの場合離した時に反応する。
タッチパネルで押した瞬間に反応するのは、高齢の人は反応するまで押し続けることがあるためと言う説がある。
ボタンの接触が悪かったりすること等からだろうが、テレビのボタンを考えると分かりやすい。
テレビのリモコンのボタンは反応するまで押し続けることが多い。
ボタンの延長線上であるタッチパネルのボタンも同じように押した瞬間に反応するようにしなければ、ずっと押したまま反応しないと誤解される可能性を考慮してこのような仕様になっていると言う話。
ただ、スマートフォンではスクロールなど押したときに反応すると対処できない機能があるため、離した時に反応するようになっていたりする。

クリックの話に戻る。
シングルタッチの時はクリックイベントを発生させるべきか?
リストのスクロールでは、スクロールした時は指を離した時に選択動作は発生しない。
その場でスクロールせずに指を離した時は、選択動作が発生する。
この場合クリックが発生しても使えない。

もちろんクリックで反応した方が楽なケースもあるだろう。
でも、状況によって発生させたり、マルチタッチ時はなくなったりするのであれば、初めからクリックイベントを無くしてしまい、離した時のイベントでアプリケーションごとに適切に処理する方が好ましいと考えられる。

クリックの問題はだいたいこんなところだろうか。
そして最初の仕様。
フラグやボタンの種類で分けて、タッチの時はクリックイベントなしでも良いかもしれないが、マルチタッチはタッチのみでタッチとマウスで操作を分けることを考えると、タッチイベントを別に追加して、互換性のためにタッチイベントをなしに出来るようにする形が良いのではないかと考えている。

と言うことで最初に書いた仕様にしようと思っているが、何か問題等あるだろうか?
もしくは、よりよい仕様はあるだろうか?


追加仕様として、イベント以外に状態を取得できるようにしたいと考えている。
マルチタッチは、イベントごとにタッチの識別子が付与され見分けられるようになっているが、この識別子をキーとした辞書で、最初に押された座標、現在の座標、直前の座標情報を得られるようにする。
マルチタッチで各種ジェスチャーを処理しようとしたら、この辺りの情報を保持する必要があるので、あらかじめ内部で保持して取得できるようにしておこうというもの。



投稿者 Takenori : 2013年05月28日 02:07




comments powered by Disqus
Total : Today : Yesterday : なかのひと