LoginSignup
0
1

More than 5 years have passed since last update.

Android 上でボタンの長押しを検知 (Delphi)

Posted at

モバイルアプリで、ボタンを普通に押したときと、長押ししたときとで、処理を分けたいことってありますよね。
長押しを検知するのには Gesture を使います。(iOSの場合 ControlType プロパティの動作もあるので、ここでは Android 限定という書き方をしています)
ただし、ボタンのクリックイベント (OnClick) も発生するので長押しと区別させたい場合は、フラグを用意するなどの処理が必要です。

サンプルアプリ

ボタンに対する長押しと、通常のクリックと処理を分けています。
フォーム上に TToolBar を置き、TToolBar の上に TButton を置いています。
残りのエリアには ListBox を Align = Client で配置して、長押しの時には LongTap, 普通のクリックの時には Click と ListBox 内に書くだけの簡単なものです。
オブジェクトインスペクタで Button1.Touch.InteractiveGestures の LongTap を True に設定し、Button1 の OnClick, OnGesture, Form1 の OnCreate イベントハンドラを作成しておきます。
qiita101.png

サンプルコード

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts,
  FMX.ListBox, FMX.StdCtrls, FMX.Controls.Presentation;

type
  TForm1 = class(TForm)
    ToolBar1: TToolBar;
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Gesture(Sender: TObject;
      const EventInfo: TGestureEventInfo; var Handled: Boolean);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private 宣言 }
    mLongTapFlag: Boolean; // add: 長押し管理フラグ
  public
    { public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if mLongTapFlag then begin
  // 長押しの時はフラグをリセット
  // このサンプルコードではOnClickイベントを抜ける
    mLongTapFlag := False;
    Exit;
  end;

  // 通常のクリックの時には ListBoxにClickと書く
  ListBox1.Items.Add('OnClick');
end;

procedure TForm1.Button1Gesture(Sender: TObject;
  const EventInfo: TGestureEventInfo; var Handled: Boolean);
begin
  // 念のためにフラグを初期化
  mLongTapFlag := False;

  // ジェスチャーの種類が長押し(LongTap)かを判断
  if EventInfo.GestureID = igiLongTap then begin
  // 長押しであればフラグをセットして
  // ListBoxに LongTapと書く
    mLongTapFlag := True;
    ListBox1.Items.Add('LongTap');
  end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  mLongTapFlag := False; // フラグ初期化
end;

end.

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1