2016年8月10日水曜日

Xamarin.Formsでアニメーション

個々のアニメーションはこれで必要十分そう。
Xamarin.Froms でビューをアニメーションさせる - mattsuDev’s blog

ただリファレンスを見る限り、これViewのメソッドじゃないんですよね。
親クラスとかインターフェースとか見てもなさそうだし。

おそらくはViewExtensionsから来てるようなんだけどstaticメソッドだし、どんな魔法でViewクラスのメソッドとして使うようになってるのでしょうか。

ちなみにキャンセルもここにstaticメソッドとして定義されていますが、サンプルは普通にViewのインスタンスメソッドとして呼んでいます。不思議。

・・・と思って調べたらC#の拡張メソッドという仕組みだそうです。
何コレ便利。

そして、あるViewに対して単発でなくていくつかのアニメーションをまとめて発動するには、前後でBatchBegin/BatchCommitを呼ぶと良いようです。

例(たぶん):
Xamarin.Forms Manual Carousel : A custom implementation of a carousel view without platform dependency | Rocca. Creative thinking

アニメーションのメソッドはそれぞれTaskを返すようなので、完了待ちなどはこれを使うことになるのでしょう。

ただちょっと分からなかったのが、例えばViewを右に移動してから戻す、ような連続して実行する場合

boxView.TranslateTo(100, 0, 250(ms), Easing.Linear).ContinueWith(
  t1 => boxView.TranslateTo(0, 0, 250(ms), Easing.Linear));

みたいな感じにするのが良いのか、

boxView.BatchBegin();
boxView.TranslateTo(100, 0, 250(ms), Easing.Linear);
boxView.TranslateTo(0, 0, 500(ms), Easing.Linear);
boxView.BatchCommit();

のほうが良いのか・・・。

前者だと数が多いとカッコだらけでワケわからなくなりそうだし、後者だとアニメーションにかける時間を足し算しないといけないので変更に弱そうだし・・・。

Xamarin.Formsにおけるマージンとパディングについて

この2ヶ月くらいXamarinを触っています。
ちょっと前までXamarinにはマージンがなく、Layoutのパディングで頑張るしかない、という状態でした。
ところがいつのまにか追加されたようです。
Layoutクラスにパディングが、Viewクラスにマージンがあるようです。
LayoutはViewから派生しているのでLayoutには両方あるということですね。
値はいずれもThicknessというクラスです。
とりあえずは「ある」ということですが、冒頭の記事を見ると使い勝手には癖があるのかもしれません。