回收者视图中每个项目的视差效果?

RED*_*ED_ 8 animation android soundcloud parallax android-recyclerview

我正在尝试使用Parallax并获得一些奇怪的错误,想知道是否有人可以添加一些输入.我见过的唯一一个有效实现视差的应用程序是soundcloud.它非常微妙,但每个项目都有一个图像背景,滚动时它具有视差效果.

我已经创建了一个自定义的RecyclerView来处理这个问题,这是我到目前为止所做的:

public class ParallaxScrollListener extends RecyclerView.OnScrollListener {

private float scrollSpeed = 0.5f;

@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
    super.onScrolled(recyclerView, dx, dy);
    LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();

    int firstVisible = layoutManager.findFirstVisibleItemPosition();
    int visibleCount = Math.abs(firstVisible - layoutManager.findLastVisibleItemPosition());

    Matrix imageMatrix;
    float tempSpeed = -100;

    if (dy > 0) {
        tempSpeed = scrollSpeed;
    } else if (dy < 0) {
        tempSpeed = -scrollSpeed;
    }

    for (int i = firstVisible; i < (firstVisible + visibleCount); i++) {
        ImageView imageView = ((MyClass.MyAdapter.MyViewHolder) recyclerView.getLayoutManager().findViewByPosition(i).getTag()).image;
        if (imageView != null) {
            imageMatrix = imageView.getImageMatrix();
            imageMatrix.postTranslate(0, tempSpeed);
            imageView.setImageMatrix(imageMatrix);
            imageView.invalidate();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的RecyclerView适配器中onBindView我也有以下内容:

 Matrix matrix = viewHolder.image.getImageMatrix();
 matrix.postTranslate(0, 0);
 viewHolder.image.setImageMatrix(matrix);
 viewHolder.itemView.setTag(viewHolder);
Run Code Online (Sandbox Code Playgroud)

最后在onViewRecycled方法内部我有以下内容:

@Override
    public void onViewRecycled(MyViewHolder viewHolder) {
        super.onViewRecycled(viewHolder);
        if (viewHolder.image != null) {
            viewHolder.image.setScaleType(ImageView.ScaleType.MATRIX);
            Matrix matrix = viewHolder.image.getImageMatrix();
            // this is set manually to show to the center
            matrix.reset();
            viewHolder.image.setImageMatrix(matrix);
        }
}
Run Code Online (Sandbox Code Playgroud)

我一直在Github上使用这段代码来实现这个想法

所以视差工作,但我的RecyclerView中的视图也移动.我在图像下方有一个CardView,它会移动,在每个项目之间产生很大的间隙.滚动是导致这种情况的原因,上下滚动得越多,间隙越大,随着视差将它们移出边界,图像变小.

我已经尝试搞乱了像scrollSpeed这样的数字OnScrollListener但是虽然它减少了bug但它也减少了视差.

有没有人对我如何在我的每个项目上实现无错误的视差效果有任何想法RecyclerView?我觉得我已经到了这个地方,但它仍然非常多,我不知道下一步是什么.

Ps我试过看第三方图书馆,但他们似乎都只使用像CoordinatorLayout这样的标题视差,我还没有找到任何只在列表中的每个项目上做的事情.

即使我没有解决我的问题,我也希望这个问题得到很好的讨论,因为Parallax在Android中似乎未被充分利用,并且关于它的问题很少.

谢谢你的时间,感谢任何帮助.

RED*_*ED_ 4

我设法让 Parallax 使用这个库:https://github.com/yayaa/ParallaxRecyclerView

对于任何自己这样做的人来说,玩一下并看看它是如何工作的仍然是一件好事。

与我的代码类似的概念,但它确实有效!哈哈。