初めまして。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.
ン
ヤチって何ぞ?ヲサと思いましたが、オンラインドキュメントを見るとリナキから追加されたようですね。
で、ニヘを使っていると……こういう情報は最初に書いておいた方がいいですね。
問題は、前のアニメーションが終了していないうちに次のアニメーションを開始していることだと思います。
この場合、前のアニメーションは即座に終了位置まで移動し、そこから次のアニメーションが始まります。
マヘヘはマウスが動いている間連続的に発生するので、一瞬で終了位置まで移動することになってしまいます。
なので、アニメーション実行中はフラグを立てておいて、二重に開始しないようにするという方法が考えられますが
これだと「アニメーションが終わった」のをどうやって検知するかという問題がありますね。
ヤニチのマニで……と考えましたが、そこまでするんだったらヤニチョモニテ使えばいいか。
アョヲサツウのプロパティウィンドウでラを選択する。右の矢印を押すと「ヤニチの新規作成」という項目が出るのでそれをクリック。
イョヲサニチアヲサが作成されるので、プロパティを以下のように設定する。
ミホヲサスヲサラヲサ(自動的に設定されているはず)
モヨヲサスヲサエーー
トヲサスヲサア
モニテヲサスヲサヤヲサ←これが大事
ウョヲサヤチを使ったコードは削除して、イ箇所とも以下に置き換える。
ニチアョモサ
スススススススススススススススススススススススススススススススススススススススス
ニコ ひろし
トコ イーアオッーアッーアィ木ゥ ーカコオオコエケ シ スュアセシ初心者セ シッニセシノヘヌ ス「コッッョョョッッアョ「 ス「ー「セ 書込者ノト:ロ ェゥ 。 ン
モコ
できました! ありがとうございます。
最初、コンポーネントのチニメソッドを使おうとしていたのですが、エンバカデロのページに
”チニヲサは非推奨になっています。ヲサチョヤチヲサを使用してください”
とあったのでヤチを使って実現しようとしていました。
勉強不足でヤニチとヤチと何が違うのかよくわかっていませんが、教えていただいたように
やったら、問題なく動作しました。
モニテヲサスヲサヤの行も、確かに設定しないと動作しないようですね。設定が無かったら
デフォルトで現在の値からアニメーションするものと思っていました。
ツイート | ![]() |