Delphi XE5のAndroid/iOSアプリケーションでロングタップを判定する

ロングタップを有効にするには、TGestureManagerコンポーネントを配置し、フォームの「Touch」→「InteractiveGestures」→「igLongTap」をチェックします。

ロングタップされると、フォームのOnGestureイベントが発生します。
EventInfoのLocationからロングタップされた座標を取得できます。

次のサンプルアプリケーションでは、ロングタップされると色を変更します。

001

フォームにTGestureManagerコンポーネントとTRectangleを配置します。

002

フォームの「Touch」→「InteractiveGestures」→「igLongTap」をチェックします。

003

フォームのOnGestureイベントを追加します。

procedure TForm1.FormGesture(Sender: TObject;
  const EventInfo: TGestureEventInfo; var Handled: Boolean);
var
  Control: IControl;
  Rectangle: TRectangle;
begin
  if EventInfo.GestureID = igiLongTap then
  begin
    if TInteractiveGestureFlag.gfBegin in EventInfo.Flags then
    begin
      Control := Self.ObjectAtPoint(ClientToScreen(EventInfo.Location));
      if Control is TRectangle then
      begin
        Rectangle := Control as TRectangle;
        Rectangle.Fill.Color := Random(4294967295);
      end;
    end;
  end;
end;

TGestureEventInfo型の引数EventInfoのGestureIDでジェスチャのがロングタップかどうかを調べます。

if EventInfo.GestureID = igiLongTap then

iOSではロングタップを開始したときと終了したときにOnGestureイベントが発生します。
Andoroidではロングタップを開始したときのみOnGestureイベントが発生します。

ロングタップが始まったときに色を変更するようにします。

if TInteractiveGestureFlag.gfBegin in EventInfo.Flags then

EventInfoのLocationでロングタップされた位置を取得し、ObjectAtPointメソッドでロングタップされた位置にあるコントロールを取得します。

Control := Self.ObjectAtPoint(ClientToScreen(EventInfo.Location));

ロングタップされた位置にあるTRectangleコンポーネントの色を変更します。

Rectangle.Fill.Color := Random(4294967295);

アプリケーションを実行して、ロングタップすると、コントロールの色が変わります。

2014年2月27日 追記

コメント欄で教えていただいたEventInfo.Flagsの判定処理を追加しました。

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください