マウスドラッグ中のアニメーションについて


ひろし  2014-12-18 09:08:35  No: 46928

初めまして。Delphiを使い始めて2か月ほどです。
TButtonのドラッグ中に他のコンポーネントのアニメーションをさせたいのですが、プロパティは変わりますが、アニメーションになりません。
コードは以下のようになっています。
ドラッグ中のアニメーションを実現する何か良い方法はありますでしょうか?
どうかよろしくお願いいたします。

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.Ani;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Single);
    procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Single);
    procedure Button1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Single);
    procedure Button2Click(Sender: TObject);
  private
    { private 宣言 }
    IsMouseDown: Boolean;
    PtX, PtY: Single;
  public
    { public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
  IsMouseDown := True;
  PtX := X;
  PtY := Y;
end;

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Single);
var
  Anime: TAnimator;
begin
  if IsMouseDown then
  begin
    Button1.Position.X := Button1.Position.X + X - PtX;
    Button1.Position.Y := Button1.Position.Y + Y - PtY;

    //アニメーションしません
    Anime := TAnimator.Create;
    try
      Anime.AnimateFloat(Button3, 'Width', 400, 1);
    finally
      Anime.Free;
    end;
  end;
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
  IsMouseDown := False;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Anime: TAnimator;
begin
  //ドラッグ中でなければ問題なくアニメーションします
  Anime := TAnimator.Create;
  try
    Anime.AnimateFloat(Button3, 'Width', 400, 1);
  finally
    Anime.Free;
  end;
end;

end.


tor  2014-12-22 23:55:03  No: 46929

ヤチって何ぞ?ヲサと思いましたが、オンラインドキュメントを見るとリナキから追加されたようですね。
で、ニヘを使っていると……こういう情報は最初に書いておいた方がいいですね。

問題は、前のアニメーションが終了していないうちに次のアニメーションを開始していることだと思います。
この場合、前のアニメーションは即座に終了位置まで移動し、そこから次のアニメーションが始まります。
マヘヘはマウスが動いている間連続的に発生するので、一瞬で終了位置まで移動することになってしまいます。

なので、アニメーション実行中はフラグを立てておいて、二重に開始しないようにするという方法が考えられますが
これだと「アニメーションが終わった」のをどうやって検知するかという問題がありますね。
ヤニチのマニで……と考えましたが、そこまでするんだったらヤニチョモニテ使えばいいか。

アョヲサツウのプロパティウィンドウでラを選択する。右の矢印を押すと「ヤニチの新規作成」という項目が出るのでそれをクリック。
イョヲサニチアヲサが作成されるので、プロパティを以下のように設定する。
  ミホヲサスヲサラヲサ(自動的に設定されているはず)
  モヨヲサスヲサエーー
  トヲサスヲサア
  モニテヲサスヲサヤヲサ←これが大事
ウョヲサヤチを使ったコードは削除して、イ箇所とも以下に置き換える。
  ニチアョモサ
スススススススススススススススススススススススススススススススススススススススス
ニコ ひろし
トコ イーアオッーアッーアィ木ゥ ーカコオオコエケ シ  スュアセシ初心者セ シッニセシノヘヌ ス「コッッョョョッッアョ「 ス「ー「セ 書込者ノト:ロ ェゥ 。 ン
モコ 

できました!  ありがとうございます。

最初、コンポーネントのチニメソッドを使おうとしていたのですが、エンバカデロのページに
”チニヲサは非推奨になっています。ヲサチョヤチヲサを使用してください”
とあったのでヤチを使って実現しようとしていました。

勉強不足でヤニチとヤチと何が違うのかよくわかっていませんが、教えていただいたように
やったら、問題なく動作しました。

モニテヲサスヲサヤの行も、確かに設定しないと動作しないようですね。設定が無かったら
デフォルトで現在の値からアニメーションするものと思っていました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加