Próbuję grać z Parallaxem i robić dziwne błędy, zastanawiając się, czy ktoś może dodać do niego jakiś sygnał wejściowy. Jedyną aplikacją, którą widziałem skutecznie wdrażającą paralaksę, jest soundcloud. Jest dość subtelny, ale każdy element ma tło obrazu i ma efekt paralaksy podczas przewijania.Efekt paralaksy na każdy element w widoku recyklera?
I utworzeniu niestandardowego RecyclerView obsłużyć to, tutaj jest to, co mam tak daleko:
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();
}
}
}
W moim RecyclerView
adaptera onBindView
Mam następujący także:
Matrix matrix = viewHolder.image.getImageMatrix();
matrix.postTranslate(0, 0);
viewHolder.image.setImageMatrix(matrix);
viewHolder.itemView.setTag(viewHolder);
Wreszcie wewnątrz metody onViewRecycled
mam następujące:
@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
Tak działa paralaksa, ale również widoki z mojego okna RecyclerView. Mam CardView pod obrazem i porusza się, tworząc duże odstępy między poszczególnymi elementami. Powoduje to przewijanie, im bardziej przewijanie w górę iw dół, tym większe stają się luki, a obrazy stają się mniejsze, gdy paralaksa usuwa je z ich granic.
Próbowałem się bawić z liczbami takimi jak scrollSpeed w OnScrollListener
, ale jednocześnie redukując błąd, redukuje on również paralaksę.
Czy ktoś ma jakieś pomysły na temat tego, w jaki sposób mogę uzyskać wolny od błędów efekt paralaksy na każdym produkcie w moim RecyclerView
? Czuję, że mam gdzieś to osiągnąć, ale nadal jest bardzo błędny i nie wiem, jaki jest następny krok.
P.s Próbowałem już patrzeć na bibliotekach stron trzecich, ale wszystkie wydają się używać tylko paralaksy nagłówka, takich jak CoordinatorLayout, nie znalazłem, że robią to tylko na każdej pozycji na liście.
Mam nadzieję, że to pytanie będzie miało dobrą dyskusję, nawet jeśli nie rozwiążę problemu, ponieważ Parallax wydaje się być niedostatecznie wykorzystany w Androidzie i jest bardzo mało w tej sprawie.
Dzięki za poświęcony czas, doceń każdą pomoc.
Czy obraz, który powinien być paralaksy taki sam w każdym widoku? Czy chcesz/musisz móc ustawić dla każdej pozycji w 'onBindVH'? –
Różne obrazy, więc tak, muszą być ustawione za każdym razem. Znalazłem bibliotekę, która to robi, wkrótce opublikuje moją odpowiedź. –