1

親ビュー (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);
    };

これは、成長ボタンに続いてフェード ボタンをクリックした結果の図です。http://i.stack.imgur.com/Usm9c.png

このシナリオは不自然です。私のプロジェクトでは、親ビューに複数の種類のアニメーションが適用されており、アニメーションが実行されていないときに描画メソッドをオーバーライドして、それらの変換をそれ自体に適用します。また、この親ビューには複数の子ビューが含まれており、それら自体がさまざまな方法でアニメーション化されています (TransitionDrawable による背景色のアニメーションを含む)。

親から子を切り離し、個別にアニメーション化し、AlphaAnimation をサブクラス化して、ApplyTransformation の現在のスケール値で子ビューの変換を更新するなど、これを回避する方法があることは認識していますが、より複雑なものに外挿すると、それは不合理になります。アニメーション。そして、TransitionDrawable を介してバックグラウンド アニメーションに関して別の壁にぶつかると確信しています。 AnimationDrawable をオーバーライドする)。

これを行うにはもっと良い方法が必要です。ここで何かが欠けているに違いないと感じています。私は、これらの種類のアニメーションが非常に複雑だとは考えていません。WP と iOS で行うのは簡単です。断る道は?独自のアニメーション スレッドを作成し、独自の無効化を処理する必要がありますか? SurfaceView を利用する必要がありますか?

私は Gingerbread をターゲットにしているので、プロパティ アニメーションで遊んだことはありません。開発が大幅に簡単になる場合は、ターゲットの切り替えがオプションになる場合があります。

4

0 に答える 0