はじめに
Delphiでモバイル開発をしていると、コントロールをタッチした際に波紋のようなアニメーションが発生することに気がつきます。
ユーザーが操作可能なオブジェクトであることが分かりやすい一方、微妙にダサいというか・・頼んでないというか・・そういう気分になることもありますね!
(意外と撮るのに苦労するスクリーンショット)
しかしながら、無効化の方法については、ドキュメントを見つけることができませんでした。
なので、この記事は「方法が正しいかは解らないけどこれで無効化できたよ!」という内容になります。
Delphi 10.3 CommunityEditionで確認しています。
※iOSについては手元に環境が無いため、確認できていません。
やり方
TButtonを例に説明します。
- マルチデバイスアプリケーションのプロジェクトを作成し、スタイルを「Android」に設定します。
- FormにTButtonを配置し、右クリックし「カスタムスタイルの編集」を選択します。
- スタイルデザイナが開いたら(
Button1Style1
というスタイルが表示されています)、「名前を付けて保存」で適当なファイル(Button.style)に保存します。 - テキストエディタで Button.style を開きます。おおよそ次のような中身になっていると思います。
object TStyleContainer
object TLayout
StyleName = 'Button1Style1'
Align = Center
Size.Width = 297.000000000000000000
Size.Height = 233.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
object TTintedButtonStyleObject
StyleName = 'background'
Align = Contents
SourceLookup = 'AndroidL Lightstyle.png'
Size.Width = 297.000000000000000000
Size.Height = 233.000000000000000000
Size.PlatformDefault = False
(中略)
TouchAnimation.Link = <
item
SourceRect.Left = 336.000000000000000000
SourceRect.Top = 233.000000000000000000
SourceRect.Right = 396.000000000000000000
SourceRect.Bottom = 293.000000000000000000
end
(略)
item
Scale = 3.000000000000000000
SourceRect.Left = 1009.000000000000000000
SourceRect.Top = 704.000000000000000000
SourceRect.Right = 1189.000000000000000000
SourceRect.Bottom = 884.000000000000000000
end>
TouchAnimation.Padding.Left = 1.000000000000000000
TouchAnimation.Padding.Top = 1.000000000000000000
TouchAnimation.Padding.Right = 1.000000000000000000
TouchAnimation.Padding.Bottom = 2.000000000000000000
HotTint.Shadow = <>
HotTint.Mask = <
(後略)
このTouchAnimetion.Link
要素が、波紋アニメーションを発生させる際の当たり判定と考えて良さそうです。
よって、TouchAnimation.Link
の中身をバッサリ削除します。TouchAnimation.Padding.*
も削除します。
TouchAnimation.Link = <> //中身を削除
HotTint.Shadow = <> //その他は前のまま
スタイルファイルを保存します。(変更前にスタイルファイルのバックアップを取った方が安全)
スタイルデザイナに戻り、
Button1Style1
を削除します。そして、「開く」アイコンをクリックし、先ほど修正したスタイル ファイルを読み込みます。スタイルを適用し、デバッグ実行で動作を確認します。
原理など
タッチアニメーションの発生・描画は、FMX.Style.Object.pas
ファイル内の、TTouchAnimationAdapter
クラスが担っており、このクラスをTActiveStyleObject
などの、スタイル定義クラスが所持しています。
先ほどのButton1style1
の場合は、backgroud
というTTintedButtonStyleObject
クラスのオブジェクトが、TTouchAnimationAdapter
を持っています。(スタイルデザイナのオブジェクトインスペクタ上でも確認できます。デザイナ上で設定を変更できればよかったのですが、出来なかった為、ファイルを直接編集して対処しました。)
スタイルの定義にTActiveStyleObject
等を用いなければ、タッチアニメーションも発生しない、ということでもあります。
逆に、スタイルを触ってたらタッチアニメーションが発生しなくなってしまった!という場合は、TouchAnimation.Link
の情報が消えてしまっていることが考えられるので、スタイルファイルを確認してみてください。
おわりに
正直「こんな手間なことってある?」と半信半疑なのですが・・。なにかもっと良い方法というか、正しいやり方がありましたら、情報頂ければと思います!