четверг, 4 сентября 2014 г.

XE7: Multi-Touch Support

Написал небольшое приложение для проверки Multi-Touch'а. Код самый простой и не оптимальный, но всё работает ;) Эта заметка к посту Что нового в XE7 или сравнение с XE6...
Обновление 6.09.14

Написано на Delphi XE7, Android 4.1.2.
Upd (3.10.14). Проверено на Android 4.4.2.










У формы появилось событие OnTouch, которое выглядит так:
FormTouch (Sender: TObject; const Touches: TTouches;  const Action: TTouchAction);

Возвращает:
Touches – тип TTouches, это массив «array of TTouch». Каждый TTouch, содержит координаты точки «Location». Проще говорят, возвращает массив точек.
Action - тип TTouchAction, возвращает действие «None, Up, Down, Move, Cancel», но для всех точек это значение одинаково.
Мне кажется, было бы лучше, если бы для каждой точки действие было своё и хранилось в «TTouch.Action», не понимаю, почему разработчики не сделали так. Или я что-то упускаю…


Код:
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.Layouts;

type
  TForm1 = class(TForm)
    Layout1: TLayout;
    LabelCountTouch: TLabel;
    procedure FormTouch(Sender: TObject; const Touches: TTouches;
      const Action: TTouchAction);
  private
    { Private declarations }
    FCountTouch: Integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

uses
  System.TypInfo;

procedure TForm1.FormTouch(Sender: TObject; const Touches: TTouches;
  const Action: TTouchAction);
var
  i, j: Integer;
  LabelNew: TLabel;
  LabelTest: TLabel;
begin

  LabelCountTouch.Text := Length(Touches).ToString;
  if FCountTouch <> Length(Touches) then
  begin
    Layout1.DeleteChildren;

    for i := 1 to Length(Touches) do
    begin
      LabelNew := TLabel.Create(Self);
      LabelNew.Parent := Layout1;
      LabelNew.Name := 'Label' + i.ToString;
      LabelNew.AutoSize := True;
      LabelNew.TextSettings.Trimming := TTextTrimming.None;
      LabelNew.TextSettings.WordWrap := False;
    end;
  end;

  for j := 0 to Length(Touches) - 1 do
  begin
    {GetEnumName(TypeInfo(TTouchAction), Ord(Action))}

    LabelTest := TLabel(FindComponent('Label' + (j+1).ToString));
    LabelTest.Position.X := Trunc(Touches[j].Location.X);
    LabelTest.Position.Y := Trunc(Touches[j].Location.Y);
    LabelTest.Text := 'Touch - ' + (j+1).ToString + ' ('
    + Trunc(Touches[j].Location.X).ToString + 'x'
    + Trunc(Touches[j].Location.Y).ToString + ')';
  end;

  FCountTouch := Length(Touches);

end;

end.

1 комментарий: