2

我需要这个用于 API11 之前的项目。

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

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

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

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

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

4

2 回答 2

11

由于您使用的是 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();

博文

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

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

于 2012-04-17T19:02:42.193 回答
0

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

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

于 2012-04-17T18:28:55.517 回答