私はParallaxで遊んで、奇妙なバグを手に入れようとしています。私が視差を効果的に実装するのを見た唯一のアプリはサウンドクラウドです。それは非常に微妙ですが、各項目には画像の背景があり、スクロールする際に視差効果があります。リサイクラービューの各項目に視差効果がありますか?
私はこれを処理するためのカスタム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);
}
}
I been working with this code on Github to get the idea
視差は機能しますが、RecyclerViewのビューも同様に動きます。私はイメージの下にCardViewを持っていて、それは動いて、各アイテムの間に大きなギャップを作ります。スクロールが原因で、スクロールが上下するほどスクロールが大きくなり、視差が小さくなるにつれて画像が小さくなります。
私はOnScrollListener
のscrollSpeedのような数字を使いこなそうとしましたが、バグを減らしながら視差も減らしています。
誰も私のRecyclerView
の各項目にバグのない視差効果をどのように達成できるかについてのアイデアはありますか?私はこれでどこかになっているように感じますが、それはまだ非常にバギーであり、次のステップが何か分かりません。
P.s私はサードパーティのライブラリを見てみましたが、それらはすべてCoordinatorLayoutのようなヘッダーの視差だけを使用しているようですが、リスト内の各項目にそのようなことはありません。
私はこの問題が解決できない場合でも、ParallaxはAndroidで十分に活用されていないようだと思っています。
お時間をいただき、ありがとうございました。
すべてのビューで視差が同じになるイメージはありますか?あるいは、あなたは 'onBindVH'の各項目のためにそれを設定できるようにしたい/したいですか? –
イメージが異なるので、毎回設定する必要があります。私はそれを行うライブラリを見つけ、すぐに私の答えを投稿します。 –