在我的 RecyclerView 的 OnScrollListener 中的 onScrolled() 中,我检查捕捉项目 (SnapHelper.findSnapView()) 到捕捉位置 (SnapHelper.calculateDistanceToFinalSnap()) 的距离,并根据它在 View 中缩放图像。
目标是在图像滚动通过我的 RecyclerView 中间的捕捉位置时放大图像。
我的问题是,当我滚动得太快(快速滚动)时,某些项目不会得到更新(大部分不会再次缩小),直到我以较慢的速度滚动到它们附近。 知道如何解决这个问题或如何在没有这个“错误”的情况下根据位置实现缩放吗?
提前致谢:)
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
View v = snapHelper.findSnapView(mRecyclerView.getLayoutManager());
float distanceFromSnap = abs(snapHelper.calculateDistanceToFinalSnap(mRecyclerView.getLayoutManager(), v)[0]);
animate(v, distanceFromSnap);
}
});
private void animate(View v, float distanceFromSnap) {
View image = v.findViewById(R.id.item_active_image);
float distanceStartAnim = 250;
float scaleStart = 0.4f;
float scaleEnd = 1.0f;
float newScale = scaleStart;
if (distanceFromSnap <= distanceStartAnim) {
float percentage = 1.0f - distanceFromSnap/distanceStartAnim;
newScale = percentage * (scaleEnd - scaleStart) + scaleStart;
}
image.setScaleX(newScale);
image.setScaleY(newScale);
}
最佳答案
您可以尝试扩展 RecyclerView 并覆盖 offsetChildrenHorizontal(int dx)
和 offsetChildrenVertical(int dy)
。我以前做过这样的事情,什么时候可以帮助你。在这里,我在向上滚动和退出屏幕时缩小了项目。
@Override
public void offsetChildrenVertical(int dy) {
super.offsetChildrenVertical(dy);
if (dy == 0)
return;
float y;
int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
View view = getChildAt(i);
y = view.getY() + view.getHeight();
if (y <= view.getHeight() && y >= 0) {
view.setScaleY(mCalculatedScaleFactor);
view.setScaleX(mCalculatedScaleFactor);
view.setAlpha(mCalculatedScaleFactor);
} else {
view.setScaleX(1);
view.setScaleY(1);
view.setAlpha(1);
}
}
}
关于android - 根据位置为 RecyclerView 项目设置动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43387069/