Android - 在缩放其父ViewGroup后为子视图设置动画

时间:2013-06-13 23:17:12

标签: android animation view invalidation viewgroup

我有一个父视图(RelativeLayout),带有子视图。我使用FillAfter = true增加父视图的比例,然后我为子视图的alpha设置动画。在子视图的alpha动画期间,只有视图的覆盖视图原始位置的部分是动画的。对我来说,子视图动画的帧失效似乎没有考虑父视图的缩放变换。 我想知道如何实现这一点 - 能够动画/转换视图层次结构的任意层。

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

这个场景是设计的 - 在我的项目中,父视图应用了多种类型的动画,并且它会覆盖draw方法,以便在动画未运行时将这些转换应用于自身。此父视图包含多个子视图,这些视图本身以多种方式设置动画(包括通过TransitionDrawable的背景颜色动画)。

我认识到这方面有很多方法 - 例如将子项与父项分离,分别为它们设置动画,并将AlphaAnimation子类化为使用ApplyTransformation中的当前比例值更新子视图转换 - 但在推断到更复杂的动画时,这会变得荒谬。而且我很确定我会通过TransitionDrawable碰到背景动画的另一面墙 - 与动画不同我不知道什么时候我有机会改变它最终会失效的区域(最后的手段是退回覆盖AnimationDrawable)。

必须有更好的方法来做到这一点,我觉得我必须在这里遗漏一些东西。我不认为这些类型的动画非常复杂;他们在WP和iOS上做的很简单。我拒绝走哪条路?我是否需要创建自己的动画线程并处理自己的失效?我应该使用SurfaceViews吗?

我的目标是姜饼,所以我没有使用过属性动画 - 但我很好奇他们是否会让这更容易?如果切换目标可以使开发变得更加简单,那么切换目标可能是一种选择。

0 个答案:

没有答案