我想要一个动画效果,就像在YouTube或Gmail应用程序中一样。当向下滚动时,顶部栏横向移出屏幕的上部线。反之亦然。但我的情况略有不同,我的屏幕布局如下:
关于上面的屏幕布局:
查看0 有一些文字显示区域。
查看1 ,预计将在View 3中的列表视图向上滚动后的视图0后面翻译
查看2 也会翻译上面的&在同一列表中的视图0下方查看视图3中的向上滚动事件,但它将保持可见状态 屏幕正下方视图0此时视图1将完全显示 隐藏在View 0后面。
查看3 是包含区域的列表视图,即使在翻译View 2后,预计也会低于View 2.
幸运的是,我突然发现这篇文章与我想要实现的完全相同,根据我的要求进行小幅调整我能够将View 1翻译为View 0&查看2在视图0下方。翻译被提供给包含View 1& 2但是只有View 1的高度,因此View 2在View 0下面保持可见。
现在我面临的问题是在翻译时,在View 1&的原始位置创建了新的空白区域。查看2.如下面的屏幕所示:
实际上,所有View 0 up-to 3都是相对布局&它们是在相对布局的父级中定义的。视图3具有视图2下方的属性。但是在翻译动画后,视图3停留在它开始时的位置,只有视图2向上移动。
我尝试将View 3作为翻译动画的一部分,在这种情况下,它与View 2一起向上移动,但在它的底部(View 3)留下了空白空间。为什么会这样?即使在动画完成后,我应该怎么做才能将View 3保持在View 2之下?
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}}