Tôi đang cố gắng để chơi với Parallax và nhận được một số lỗi lạ, tự hỏi nếu có ai có thể thêm một số đầu vào cho nó. Ứng dụng duy nhất tôi đã nhìn thấy thực hiện thị sai hiệu quả là soundcloud. Nó khá tinh tế, nhưng mỗi mục có một nền hình ảnh và nó có hiệu ứng thị sai khi bạn di chuyển.Hiệu ứng thị sai trên mỗi mục trong chế độ xem của người tái chế?
Tôi đã tạo một RecyclerView tùy chỉnh để xử lý việc này, đây là những gì tôi có cho đến nay:
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();
}
}
}
Trong tôi RecyclerView
Adaptor của onBindView
Tôi có sau đây cũng như:
Matrix matrix = viewHolder.image.getImageMatrix();
matrix.postTranslate(0, 0);
viewHolder.image.setImageMatrix(matrix);
viewHolder.itemView.setTag(viewHolder);
Cuối cùng bên trong phương pháp onViewRecycled
Tôi có những điều sau đây:
@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
Vì vậy, các công trình thị sai, nhưng các chế độ xem trong di chuyển RecyclerView của tôi là tốt. Tôi có một CardView bên dưới hình ảnh và nó di chuyển, tạo ra những khoảng trống lớn giữa mỗi mục. Di chuyển là nguyên nhân gây ra điều này, càng di chuyển lên và xuống càng lớn thì khoảng trống càng lớn và hình ảnh sẽ nhỏ hơn khi thị sai di chuyển chúng ra khỏi giới hạn của chúng.
Tôi đã thử làm rối tung các con số như scrollSpeed trong OnScrollListener
nhưng trong khi nó làm giảm lỗi, nó cũng làm giảm thị sai.
Có ai có ý tưởng nào về cách tôi có thể đạt được hiệu ứng thị sai lỗi miễn phí trên mỗi mục trong số RecyclerView
của mình không? Tôi cảm thấy như tôi đang nhận được một nơi nào đó với điều này nhưng nó vẫn còn rất buggy và tôi không biết bước tiếp theo là gì.
P. Tôi đã thử xem các thư viện của bên thứ ba nhưng tất cả dường như chỉ sử dụng sai số đầu trang như CoordinatorLayout, tôi không tìm thấy bất kỳ thư nào làm điều đó trên mỗi mục trong danh sách.
Tôi hy vọng câu hỏi này sẽ được thảo luận tốt ngay cả khi tôi không giải quyết được vấn đề của mình vì Parallax dường như không được sử dụng trong Android và có rất ít thông tin về nó.
Cảm ơn bạn đã dành thời gian, đánh giá cao mọi trợ giúp.
Hình ảnh có nên được xem là giống nhau trên mỗi chế độ xem không? Hay bạn muốn/cần có thể thiết lập nó cho mỗi mục trong 'onBindVH'? –
Hình ảnh khác nhau, vì vậy, chúng cần phải được đặt mỗi lần. Tôi tìm thấy một thư viện thực hiện nó, sẽ sớm đăng câu trả lời của tôi. –