Android에서 버튼 길게 누르기 감지 (Delphi)

모바일 앱으로, 버튼을 보통으로 눌렀을 때와, 길게 눌렀을 때와, 처리를 나누고 싶은 일이 있지요.
길게 누르기를 감지하려면 Gesture를 사용합니다. (iOS의 경우.
다만, 버튼의 클릭 이벤트(OnClick)도 발생하므로 길게 누르기와 구별시키고 싶은 경우는, 플래그를 준비하는 등의 처리가 필요합니다.

샘플 앱



버튼을 길게 누르면 일반 클릭과 처리가 나뉩니다.
양식에 TToolBar를 놓고 TToolBar 위에 TButton을 놓습니다.
나머지 영역에는 ListBox 를 Align = Client 로 배치해, 길게 누를 때는 LongTap, 보통의 클릭시에는 Click 와 ListBox 안에 쓰는 것만으로 간단한 것입니다.
Object Inspector에서 Button1.Touch.InteractiveGestures의 LongTap을 True로 설정하고 Button1의 OnClick, OnGesture, Form1의 OnCreate 이벤트 처리기를 만듭니다.
ControlType 속성 동작

샘플 코드


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.

좋은 웹페이지 즐겨찾기