【问题标题】:Android animate view comming into screen that pushes the current full screen view outAndroid 动画视图进入屏幕,将当前全屏视图推出
【发布时间】:2012-04-19 07:07:18
【问题描述】:

我在 API11 之前的项目中需要这个。

我正在寻找一种从右侧添加视图的方法,这将导致当前的全屏视图向左移动,以允许新视图在屏幕中可见。

新视图大约是屏幕宽度的 1/3,这就是当前全屏视图应该移出屏幕的距离。

我已经厌倦了使用 TranslateAnimation() 的各种解决方案,虽然我对动画很满意,但我遇到了原始视图中的所有可点击区域都不是它们应该在的位置的问题。

所以我开始使用布局以使用负边距正确定位它,但是几秒钟后,当一个新的布局请求出现时,视图会弹回原位。当在动画结束侦听器上移动视图时,此解决方案也会产生断断续续的效果。

什么是最简单的解决方案,在新视图进入或退出时具有良好的动画效果,并将视图放置在布局方面的正确位置。

【问题讨论】:

    标签: android animation layout


    【解决方案1】:

    由于您使用的是 API11,因此请使用 Animator API。所有视图现在都有相应的设置器和获取器的属性。要将视图向左移到范围之外,请获取屏幕宽度,然后执行以下操作:

    View viewToShiftOut = getOutView();
    ObjectAnimator outAnim = ObjectAnimator.ofFloat(viewToShiftOut, "x", 0, -widthOfScreen);
    outAnim.setDuration(1000);
    outAnim.start();
    

    这会将视图及其内容完全移出屏幕,持续时间为 1 秒(1000 毫秒)。要在它的位置移动一个,请执行以下操作:

    View viewToShiftIn = getInView();
    ObjectAnimator inAnim = ObjectAnimator.ofFloat(viewToShiftIn, "x", widthOfScreen, 0);
    inAnim.setDuration(1000);
    inAnim.start();
    

    所有属性、可点击区域等都将跟随视图,因此您将在动画完成时完成。您可以像这样将它们一起制作动画:

    View viewToShiftOut = getOutView();
    View viewToShiftIn = getInView();
    ObjectAnimator outAnim = ObjectAnimator.ofFloat(viewToShiftOut, "x", 0, -widthOfScreen);
    ObjectAnimator inAnim = ObjectAnimator.ofFloat(viewToShiftOut, "x", widthOfScreen, 0);
    outAnim.setDuration(1000);
    inAnim.setDuration(1000);
    outAnim.start();
    inAnim.start();
    

    Blog post

    编辑:我注意到您只想将视图移动 1/3,因此您可以获得每个移动像素的数量 widthOfScreen/3

    编辑 2:另一个优点是您可以将它与硬件加速一起使用,而不会出现大多数 3.0+ 平板电脑所具有的问题。

    【讨论】:

    • 我的错误,显然我的意思是 API 11 之前,没有 setX setY 或对象动画师。
    • 好的。我对此没有太多经验。我认为人们通常的做法是相应地设置边距。在这种情况下,您需要以编程方式将要移出的视图的左右边距设置为要移入的视图宽度的差异。负边距将视图移出屏幕。您要移入的视图的左边距为screensize - viewWidth,右边距为0。致电requestLayout(),它应该设置好一切。我从来没有做过,所以我不会把它作为答案,但它似乎对我有用。
    【解决方案2】:

    您可能需要在 AnimationListener 的 onAnimationEnd 中以编程方式更改布局,以匹配您想要的最终定位,而不是使用 fillAfter 和 fillEnabled。

    要消除闪烁,请在您正在制作动画的 View 上调用 clearAnimation(),也在 onAnimationEnd 中。

    【讨论】:

    • 是的,我就是这么做的。在调用 view.layout(new coords) 之后,虽然视图移动到了正确的位置(这也需要 x 上的负边距),但一段时间后系统再次调用 layout 并且视图重新回到原位。我尝试了各种方法来确保会发生这种情况我扩展了布局并更改了 layout(r,t,l,b) 中的值以反映正确的位置,但这根本没有任何效果。
    • 你能发布你的代码吗?我不清楚你到底指的是什么。
    猜你喜欢
    • 2015-01-14
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    相关资源
    最近更新 更多