ViewPropertyAnimator将动画转换为View后,是否在相对布局中创建了空白空间?

时间:2017-07-09 10:49:18

标签: android animation viewpropertyanimator

我想要一个动画效果,就像在YouTube或Gmail应用程序中一样。当向下滚动时,顶部栏横向移出屏幕的上部线。反之亦然。但我的情况略有不同,我的屏幕布局如下:

Car.toString()

关于上面的屏幕布局:

  1. 查看0 有一些文字显示区域。

  2. 查看1 ,预计将在View 3中的列表视图向上滚动后的视图0后面翻译

  3. 查看2 也会翻译上面的&在同一列表中的视图0下方查看视图3中的向上滚动事件,但它将保持可见状态     屏幕正下方视图0此时视图1将完全显示     隐藏在View 0后面。

  4. 查看3 是包含区域的列表视图,即使在翻译View 2后,预计也会低于View 2.

  5. 幸运的是,我突然发现这篇文章与我想要实现的完全相同,根据我的要求进行小幅调整我能够将View 1翻译为View 0&查看2在视图0下方。翻译被提供给包含View 1& 2但是只有View 1的高度,因此View 2在View 0下面保持可见。

    现在我面临的问题是在翻译时,在View 1&的原始位置创建了新的空白区域。查看2.如下面的屏幕所示:

    enter image description here

    实际上,所有View 0 up-to 3都是相对布局&它们是在相对布局的父级中定义的。视图3具有视图2下方的属性。但是在翻译动画后,视图3停留在它开始时的位置,只有视图2向上移动。

    我尝试将View 3作为翻译动画的一部分,在这种情况下,它与View 2一起向上移动,但在它的底部(View 3)留下了空白空间。为什么会这样?即使在动画完成后,我应该怎么做才能将View 3保持在View 2之下?

    以下是我所关注的文章:enter image description here

    ViewPropertyAnimator的Android博客: https://rylexr.tinbytes.com/2015/04/27/how-to-hideshow-android-toolbar-when-scrolling-google-play-musics-behavior/

    我搜索了很多这个解决方案我尝试了不同的东西,但没有任何效果最终我认为我应该发布问题,以便任何已经遇到过这类问题的人可能会有所帮助。

    感谢您阅读这个大问题。

    这是代码:

    XML

    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                    super.onScrollStateChanged(recyclerView, newState);
                    if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                        if (scrollingUp) {
                            if (verticalOffset > animate_child.getHeight()) {
                                animateHide();
                            } else {
                                animateShow(verticalOffset);
                            }
                        } else {
                            if (animate_child.getTranslationY() < animate_child.getHeight() * -0.6 && verticalOffset > animate_child.getHeight()) {
                                animateHide();
                            } else {
                                animateShow(verticalOffset);
                            }
                        }
                    }
                }
    
                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    verticalOffset += dy;
                    scrollingUp = dy > 0;
                    int toolbarYOffset = (int) (dy - animate_parent.getTranslationY());
                    animate_parent.animate().cancel();
                    if (scrollingUp) {
                        if (toolbarYOffset < animate_child.getHeight()) {
                            if (verticalOffset > animate_child.getHeight()) {
                                toolbarSetElevation(ELEVATION_CONSTANT);
                            }
                            animate_parent.setTranslationY(-toolbarYOffset);
                        } else {
                            toolbarSetElevation(0);
                            animate_parent.setTranslationY(-animate_child.getHeight());
                        }
                    } else {
                        if (toolbarYOffset < 0) {
                            if (verticalOffset <= 0) {
                                toolbarSetElevation(0);
                            }
                            animate_parent.setTranslationY(0);
                        } else {
                            if (verticalOffset > animate_child.getHeight()) {
                                toolbarSetElevation(ELEVATION_CONSTANT);
                            }
                            animate_parent.setTranslationY(-toolbarYOffset);
                        }
                    }
    
                }
            });
    

    Java代码:

    在回收商视图上滚动侦听器:

    private void animateShow(final int verticalOffset) {
            animate_parent.animate()
                    .translationY(0)
                    .setInterpolator(new LinearInterpolator())
                    .setDuration(180)
                    .setListener(new AnimatorListenerAdapter() {
                        @Override
                        public void onAnimationStart(Animator animation) {
                            setElevation(verticalOffset == 0 ? 0 : ELEVATION_CONSTANT);
                        }
                    });
    }
    
    private void animateHide() {
            animate_parent.animate()
                    .translationY(-animate_child.getHeight())
                    .setInterpolator(new LinearInterpolator())
                    .setDuration(180)
                    .setListener(new AnimatorListenerAdapter() {
                        @Override
                        public void onAnimationEnd(Animator animation) {
                            setElevation(0);
                        }
                    });
    }
    
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    private void setElevation(float elevation) {
            // setElevation() only works on Lollipop
            if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
                animate_parent.setElevation(elevation);
            }
    }
    

    助手功能:

    {{1}}

0 个答案:

没有答案