親ビュー (RelativeLayout) と子ビューがあります。親ビューのスケールを FillAfter = true で増やし、続いて子ビューのアルファをアニメーション化します。子ビューのアルファのアニメーション中は、ビューの元の位置をカバーするビューの部分のみがアニメーション化されます。私には、子ビュー アニメーションのフレーム無効化が、親ビューのスケール変換を考慮していないように見えます。ビュー階層の任意のレイヤーをアニメーション化/変換できる機能です。
RelativeLayout rootLayout = FindViewById<RelativeLayout>(Resource.Id.RootLayout);
rootLayout.SetClipChildren(false);
RelativeLayout parentLayout = new RelativeLayout(this);
parentLayout.SetClipChildren(false);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(500, 500);
layoutParams.LeftMargin = (this.Window.WindowManager.DefaultDisplay.Width - 500) / 2;
layoutParams.TopMargin = (this.Window.WindowManager.DefaultDisplay.Height - 500) / 2;
parentLayout.LayoutParameters = layoutParams;
parentLayout.SetBackgroundColor(new Color(255, 0, 0, 255));
rootLayout.AddView(parentLayout);
View childView = new View(this);
RelativeLayout.LayoutParams viewLayoutParams = new RelativeLayout.LayoutParams(200, 200);
viewLayoutParams.LeftMargin = 150;
viewLayoutParams.TopMargin = 150;
childView.LayoutParameters = viewLayoutParams;
childView.SetBackgroundColor(new Color(0, 255, 0, 255));
parentLayout.AddView(childView);
Button growButton = FindViewById<Button>(Resource.Id.growButton);
growButton.Click += delegate
{
ScaleAnimation scaleAnimation = new ScaleAnimation(1, 1.2f, 1, 1.2f, parentLayout.Width / 2, parentLayout.Height / 2);
scaleAnimation.Duration = 1000;
scaleAnimation.FillAfter = true;
parentLayout.StartAnimation(scaleAnimation);
};
Button fadeButton = FindViewById<Button>(Resource.Id.fadeButton);
fadeButton.Click += delegate
{
AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0.5f);
alphaAnimation.Duration = 1000;
alphaAnimation.FillAfter = true;
childView.StartAnimation(alphaAnimation);
};
これは、成長ボタンに続いてフェード ボタンをクリックした結果の図です。
このシナリオは不自然です。私のプロジェクトでは、親ビューに複数の種類のアニメーションが適用されており、アニメーションが実行されていないときに描画メソッドをオーバーライドして、それらの変換をそれ自体に適用します。また、この親ビューには複数の子ビューが含まれており、それら自体がさまざまな方法でアニメーション化されています (TransitionDrawable による背景色のアニメーションを含む)。
親から子を切り離し、個別にアニメーション化し、AlphaAnimation をサブクラス化して、ApplyTransformation の現在のスケール値で子ビューの変換を更新するなど、これを回避する方法があることは認識していますが、より複雑なものに外挿すると、それは不合理になります。アニメーション。そして、TransitionDrawable を介してバックグラウンド アニメーションに関して別の壁にぶつかると確信しています。 AnimationDrawable をオーバーライドする)。
これを行うにはもっと良い方法が必要です。ここで何かが欠けているに違いないと感じています。私は、これらの種類のアニメーションが非常に複雑だとは考えていません。WP と iOS で行うのは簡単です。断る道は?独自のアニメーション スレッドを作成し、独自の無効化を処理する必要がありますか? SurfaceView を利用する必要がありますか?
私は Gingerbread をターゲットにしているので、プロパティ アニメーションで遊んだことはありません。開発が大幅に簡単になる場合は、ターゲットの切り替えがオプションになる場合があります。