Delphi XE5でモバイルアプリケーションのコントロールをジェスチャで回転する

010

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

001

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

002

FillプロパティのKindプロパティを「bkGradient」にします。

003

グラデーションになりました。

004

必要なら、FillプロパティのGradientプロパティから編集を選択して、グラデーションの設定をします。

005

006

007

フォームのTouchプロパティのInteractiveGesturesのigRotateにチェックを入れます。

008

フォームにFLastAngleフィールドを追加します。

type
  TForm1 = class(TForm)
  private
    FLastAngle: Single;

FLastAngleフィールドは、ジェスチャで回転する前の角度を持ちます。

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

009

procedure TForm1.FormGesture(Sender: TObject;
  const EventInfo: TGestureEventInfo; var Handled: Boolean);
var
  Control: IControl;
  Rectangle: TRectangle;
begin
  if EventInfo.GestureID = igiRotate then
  begin
    Control := Self.ObjectAtPoint(ClientToScreen(EventInfo.Location));
    if Control is TRectangle then
    begin
      Rectangle := Control as TRectangle;
      if TInteractiveGestureFlag.gfBegin in EventInfo.Flags then
      begin
        FLastAngle := Rectangle.RotationAngle;
      end
      else
      begin
        Rectangle.RotationAngle := FLastAngle - (EventInfo.Angle * 180) / Pi;
      end;
    end;
  end;
end;

OnGestuerイベントはジェスチャが行われたときに発生します。

引数のEventInfoはイベントの情報を保持しています。

EventInfoのGestureIDからジェスチャを識別します。

if EventInfo.GestureID = igiRotate then

EventInfoのLocationからジェスチャの行われた位置を取得し、ObjectAtPointメソッドで該当する位置にあるコントロールを取得します。

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

EventInfoのFlagsでジェスチャの状態を取得します。
ジェスチャが開始されたときは、現在の角度をFLastAngleフィールドに保持します。

if TInteractiveGestureFlag.gfBegin in EventInfo.Flags then
begin
  FLastAngle := Rectangle.RotationAngle;
end

回転されたときは、Rectangleの角度を更新します。

Rectangle.RotationAngle := FLastAngle - (EventInfo.Angle * 180) / Pi;

このエントリーは「C++Builder XE5 – Rotation Interactive Gesture」を参考にしました。

コメントを残す

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

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