Delphi 앱 - 스마트 폰의 흔들림을 가볍게 감지

스마트폰을 흔들었을 때 무언가를 처리하고 싶을 때입니다만, OnShake 와 같은 편리한 이벤트라고 하는 것은 없습니다.
불행히도, 흔들렸는지, 단순한 이동인지는 센서만으로는 판단은 할 수 없습니다.
「Android shake 검출」등의 키워드로, 검색하면 여러분 여러가지 로직으로 검지하고 있습니다.
(기본적으로 가속도 센서를 사용하여 감지합니다)

Delphi로 만든 앱으로 구현해 보았습니다.
가속도 센서의 컴포넌트 TMotionSensor와 TTimer를 사용하여 진폭과 속도에서 어리석은 알고리즘으로 감지합니다.

거친 알고리즘



일정 시간내(0.3초)로, 진폭이 ±1 이상이면 카운트를 실시해, 카운트가 3 이상이 되면 쉐이크로 간주하고 있습니다.
쉐이크의 방향은 X, Y, Z 각각 있기 때문에,
(기점의 X + Y + Z) - (시간내 종점의 X + Y + Z)
의 값을 진폭으로 하고 있습니다.

디자인 화면



MotionSensor의 Active를 True로 설정하는 것을 잊지 마십시오.


샘플 코드


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.StdCtrls,
  FMX.Controls.Presentation, System.Sensors, System.Sensors.Components;

type
  TForm1 = class(TForm)
    ToolBar1: TToolBar;
    Switch1: TSwitch;
    Label1: TLabel;
    Timer1: TTimer;
    MotionSensor1: TMotionSensor;
    procedure Timer1Timer(Sender: TObject);
    procedure Switch1Switch(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private 宣言 }
  public
    keepPoint: Double;      //位置保存
    shakeCount: Integer;  //振りカウント
    { public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.FormCreate(Sender: TObject);
begin
// 初期化
  keepPoint  := 0;
  shakeCount := 0;
  Label1.Text := ' ';
end;

procedure TForm1.Switch1Switch(Sender: TObject);
begin
//スイッチが ONになったらカウントの初期化と基本ざっくり位置を保存する
  if Switch1.IsChecked then begin
    shakeCount := 0;
    Label1.Text := ' ';
    keepPoint := MotionSensor1.Sensor.AccelerationX
      + MotionSensor1.Sensor.AccelerationY
      + MotionSensor1.Sensor.AccelerationZ;
  end;

//Timerの起動を制御
  Timer1.Enabled := Switch1.IsChecked;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  mPoint: Double;  //作業用
begin
// 振りカウントが 3以上になったらシェイクとみなす
  if shakeCount > 3 then begin
    Label1.Text := 'しぇいく';
    shakeCount := 0;
    Switch1.IsChecked := False;
    exit;
  end;

// 現在位置ざっくり
  mPoint := MotionSensor1.Sensor.AccelerationX
   + MotionSensor1.Sensor.AccelerationY
   + MotionSensor1.Sensor.AccelerationZ;

  if ((keepPoint - mPoint) > 1) or ((keepPoint - mPoint) < -1) then begin
  // 振りカウント +1
    shakeCount := shakeCount + 1;
  end;

// 現在ざっくり位置保存
  keepPoint := mPoint;

end;

end.

실행해보기



앱을 시작하고


스위치를 켜고 스마트 폰을 척

라고 감지했습니다!

좋은 웹페이지 즐겨찾기