|
Delphi2010 ジェスチャ(3) 2010/11/26 |
前回までは、ジェスチャの「標準ジェスチャ」について見てきました。今回は対話型ジェスチャ(インタラクティブジェスチャ)について記述します。対話型ジェスチャは、2本の指が必要です(1方向パンを除く)。
前回と同じくテスト28に追記しますが、ややこしくなると何なので、パネルをもう1つ追加して(Panel3)、そちらを操作することにします。前回と同様、パネル Panel3 を選択し、<オブジェクトインスペクタ>にて、Touchプロパティ内の GestureManagerプロパティ欄の右端の▼をクリックして「GestureManager1」にします。
↓
対話型ジェスチャは、Touchプロパティ〜InteractiveGesturesプロパティのうち、下記のうちの対応したいジェスチャにチェックを入れます。以下ヘルプより
igZoom | 259 | "ズーム" ジェスチャ。2本指での使用が必要です。 |
igPan | 260 | "パン" ジェスチャ。スクロールに使用されます。1本指で使用できます。 |
igRotate | 261 | "回転" ジェスチャ。UI 要素を回転するのに使用されます。指が2本必要です。 |
igTwoFingerTap | 262 | "ツー フィンガー タップ" ジェスチャ。指が2本必要です。 |
igPressAndTap | 263 | "プレス アンド タップ" ジェスチャ。押したままにする動作とタップにそれぞれ 1本ずつの、2本の指が必要です。 |
「パン」は1本指でも可、となっていますが、何度か試した結果、1本指ではなかなか反応しないです。2本指の方が反応しやすいですね。「ツーフィンガータップ」は2本指で同時にタッチする感じ。「プレスアンドタップ」は1本指を押してもう1本指を押すのですがタイミングが難しい。
処理内容は、OnGestureイベントハンドラで記述します。
タッチした内容の情報は、引数 EventInfo で取得できますが、これがどのような値になるかを知るために、以下のように記述してみました。パネル Panel3 の上にラベル Label1 を配置しています。
procedure TForm1.Panel3Gesture(Sender: TObject;
const EventInfo: TGestureEventInfo; var Handled: Boolean);
var
fs : string ;
begin
fs := '' ;
if (gfBegin in EventInfo.Flags) then
fs := fs + '[BEGIN]' ;
if (gfInertia in EventInfo.Flags) then
fs := fs + '[INERTIA]' ;
if (gfEnd in EventInfo.Flags) then
fs := fs + '[END]';
Label1.Caption := 'ID:'+IntToStr(EventInfo.GestureID) + #13 + #10
+ 'Location:' + IntToStr(EventInfo.Location.X)
+ ',' + IntToStr(EventInfo.Location.Y) + #13 + #10
+ 'Flags:' + fs + #13 + #10
+ 'Angle:' + FloatToStr(EventInfo.Angle) + #13 + #10
+ 'Distance:' + IntToStr(EventInfo.Distance) + #13 + #10
+ 'InertiaVector:' + IntToStr(EventInfo.InertiaVector.x)
+ ',' + IntToStr(EventInfo.InertiaVector.y) + #13 + #10
+ 'TapLocation:' + IntToStr(EventInfo.TapLocation.x)
+ ',' + IntToStr(EventInfo.TapLocation.y) ;
Handled := True ;
end; |
「igZoom」「igPan」「igRotate」「igTwoFingerTap」「igPressAndTap」のうちのどれを行ったのかは、EventInfo.GestureID の値で分かりますが、上記で書いたように、259〜263の値になるようです。但しこの値は他の要因で変わるかもしれませんので御注意下さい(ヘルプで探しましたが見つかりませんでした)。
EventInfo.Locationは、TPoint型で、ヘルプには「コントロール上での現在の位置。Location には、直前の既知のポイントの X 座標と Y 座標が含まれます。」と記載されています。
EventInfo.Flagsは、TInteractiveGestureFlags型で、下記のうちの1つ以上の値が設定されます(2つ、3つの値になる場合もあります)。下記はヘルプより。
gfBegin | 対話型ジェスチャは開始したばかりです。 |
gfInertia | 対話型ジェスチャは慣性で継続しています。 |
gfEnd | 対話型ジェスチャは終了します。 |
EventInfo.Angleは、double型で、タップした2本の指の、固定点〜動点の角度をラジアン値で取得できます。反時計回りがプラス値、時計回りがマイナス値のようです。回転の場合のみ取得できます。
EventInfo.Distanceは、Integer型で、2本指の間の距離を取得できます。パン、ズームの場合に利用して下さい。プレスアンドタップの場合は不明な値になります。
EventInfo.InertiaVectorは、TSmallPoint型で、慣性速度ベクトルを示すようです。基本的には、パンの場合・フリック動作をした際のX方向・Y方向への慣性力(慣性のついている間は数値は変化します)を取得する際に利用出来そうです。
EventInfo.TapLocationは、TSmallPoint型で、ヘルプには「"タップ" および "プレス アンド タップ" ジェスチャの座標を指定します。」と記載されています。しかしこの値は、ズーム・パンの場合には X値は Distanceと同値で Y値は 0、回転・2本指タップ・1本指タップの場合は(0,0)、プレスアンドタップ時は Locationと同値で、ほとんど意味を成さないもののように思われます。
ただ、座標値そのものは、ジェスチャ無し/標準ジェスチャとしてタップした時の値と対話型ジェスチャとして取得した値とでは異なる様子なので、これをそのまま座標値として各種計算にそのまま利用するのはまずいかもしれません。あくまでも、どういうジェスチャをしたのか、どれくらいの量のジェスチャをしたのか、という取り方をしたほうが良いように思われます。
Touchプロパティ〜InteractiveGestureOptionsプロパティは、対話型ジェスチャで使用するオプションです。以下のものがあります(ヘルプより)。
igoPanSingleFingerHorizontal | 指を水平に移動したときに、"パン" ジェスチャが生成されます。 |
igoPanSingleFingerVertical | 指を垂直に移動したときに、"パン" ジェスチャが生成されます。 |
igoPanInertia | 慣性に対してもパン ジェスチャが生成されます。画面から指を離しても、パン イベントは継続されますが、慣性効果をシミュレートしながら縮小します。 |
igoPanGutter | パン ジェスチャをマージンで有効にします。 |
igoParentPassthrough | 未処理の対話型ジェスチャが親コントロールに渡されます。 |
なお、「マルチタッチ」といっても、1コントロール内での2本指での対話型ジェスチャの場合にのみ有効で、2つのコントロールを同時にタップ、というような事は出来ないようです。
このほか、Touchプロパティ内にはペン・タブレット用のプロパティがあります。以下、ヘルプより。
ParentTabletOptionsプロパティ:
タブレットで生成されたどのジェスチャが親コントロールにリダイレクトされるかを示します。
TabletOptionsプロパティ:
所有者であるコントロールで、タブレットで生成されたどのジェスチャを処理するかを示します。
toPressAndHold |
toPenTapFeedback |
toPenBarrelFeedback |
toTouchUIForceOn |
toTouchUIForceOff |
toTouchSwitch |
toFlicks |
toSmoothScrolling |
toFlickFallbackKeys |
とありますが、実際にワコム製タブレットを接続してみましたが、別段反応らしきものはありませんし、何がどう影響するのか、どこでどういう値が特別に取得出来るのか等はよく分かりませんでした。ヘルプを見ても、これ以上の説明が見当たりませんし、まぁこういうのがあるというだけで、通常は気にしなくてよさそうです。
|
|
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
>Delphi入門編
>Delphi2010
▲2010/11/25
2010/11/26
▼2010/11/27
シェアウェア
Script!World
データベース
|