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

我试图玩Parallax和得到一些奇怪的错误,想知道如果有人可以添加一些input。 我见过的唯一有效实现视差的应用程序是soundcloud。 这是非常微妙的,但每个项目都有一个图像的背景,并有滚动时的视差效果。

我已经创build了一个自定义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(); } } } 

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

  Matrix matrix = viewHolder.image.getImageMatrix(); matrix.postTranslate(0, 0); viewHolder.image.setImageMatrix(matrix); viewHolder.itemView.setTag(viewHolder); 

最后在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); } } 

我一直在Github上使用这个代码来获得这个想法

所以视差效果,但在我的RecyclerView移动以及。 我在图像下方有一个CardView,它会移动,在每个项目之间产生很大的差距。 滚动是造成这种情况的原因,上下滚动越多,间隙越大,视差越大,图像越小。

我已经尝试了像OnScrollListener scrollSpeed这样的数字,但它减less了错误,同时也减less了视差。

有没有人有任何想法,我可以如何实现我的RecyclerView每个项目的无bug视差效果? 我觉得我正在得到这个地方,但它仍然是错误的,我不知道下一步是什么。

Ps我试过看第三方库,但他们似乎只使用像CoordinatorLayout头像视差,我还没有发现任何只是在列表中的每个项目。

我希望这个问题能得到很好的讨论,即使我没有解决我的问题,因为Parallax在Android上似乎没有得到充分的利用,而且这方面的内容很less。

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

Solutions Collecting From Web of "在回收视图中的每个项目的视差效果?"

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

对于自己做这件事的人来说,玩这个游戏还是很好玩的。

类似的概念,我的代码,但它实际上工作! 哈哈。

你在正确的轨道上。 你必须使用ScrollListener。 此外,您必须访问RecyclerViews LayoutManager并遍历所有可见的项目,并根据滚动的像素量设置translateY

因为不能使用recyclerView.getChildAt(pos)因为LayoutManager负责布局元素,并且它们在LayoutManager中的顺序可能与getChildAt(pos)顺序不同。

所以algorithm基本上应该是这样的(伪代码,假设使用LinearLayoutManager):

 for (int i = layoutManager.findFirstVisibleItemPosition(); i <= layoutmanager.findLastVisibleItemPosition; i++){ // i is the adapter position ViewHolder vh = recyclerView.findViewHolderForAdapterPosition(i); vh.imageView.setTranslationY( computedParalaxOffset ); // assuming ViewHolder has a imageView field on which you want to apply the parallax effect }