如何使用动画平滑地翻译View屏幕和关闭屏幕?

时间:2011-07-21 21:07:52

标签: android android-layout

想象一下你有这个布局:

___________________________________________
|                                         |
|                                         |
|               TOP CONTENT               |
|                                         |
|_________________________________________|
|                                         |
|                                         |
|                 BOTTOM                  |
|                 CONTENT                 |
|                                         |
|_________________________________________|

我想从屏幕上滑动顶部内容,我可以使用翻译动画(在XML中定义)成功完成。我设置了一个监听器,以便在动画结束时,TOP CONTENT的可见性设置为View.GONE。我的问题是,当动画正在执行时,TOP CONTENT占用的区域仍然在屏幕上。 BOTTOM CONTENT不会随之滑动。基本上,对于动画执行的500毫秒,BOTTOM CONTENT保持在其位置,然后在动画结束后突然向上移动。

如何使BOTTOM CONTENT在TOP CONTENT的下边缘保持其layout_below参数并以TOP CONTENT平滑向上滚动?这是否需要在BOTTOM CONTENT上使用另一个动画?

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

  

这是否需要在BOTTOM CONTENT上使用另一个动画?

这通常是我如何做的,而且效果很好。

答案 1 :(得分:1)

只是一个想法:

尝试使用makeInAnimation(Context c, boolean fromLeft)makeOutAnimation(Context c, boolean toRight)

这些最初设计为向右/向左滑动,但您可以覆盖它们或对默认动画执行转换。

另外,请确保您使用的是AnimationSet

这将确保同时播放两个动画。

希望这有帮助!

来源:http://developer.android.com/reference/android/view/animation/AnimationUtils.html

答案 2 :(得分:0)

我有一个适合我的解决方案,甚至更好地使用动画来使其流畅。

private int heightOfScreen;

   @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        configureLayoutListener();
    }

private void configureLayoutListener() {
        mNormalModelayoutContainer.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                heightOfScreen = mNormalModelayoutContainer.getHeight();
                ViewTreeObserver viewTreeObserver = mNormalModelayoutContainer.getViewTreeObserver();
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                    viewTreeObserver.removeOnGlobalLayoutListener(this);
                } else {
                    viewTreeObserver.removeGlobalOnLayoutListener(this);
                }
            }
        });
    }

    private void animate() {
        View viewToShiftOut = mNormalModelayoutContainer;
        View viewToShiftIn = mEditModelayoutContainer;
        ObjectAnimator outAnim = ObjectAnimator.ofFloat(viewToShiftOut, "y", 0, -heightOfScreen/2);
        ObjectAnimator inAnim = ObjectAnimator.ofFloat(viewToShiftIn, "y", heightOfScreen/2, 0);
        outAnim.setDuration(1000);
        inAnim.setDuration(1000);
        outAnim.start();
        inAnim.start();
    }

这适用于片段,但可以适用于任何视图或活动。 N / B: - 注意我们测量高度的方式和位置       - 进出视图在oppsosite方向上移动,但可以在任何罗盘方向上移动。