У меня есть просмотрщик с фрагментами.Каждый фрагмент содержит RecyclerView изображений с эффектом параллакса.Также viewpager реализует CubeOutTransformation .Во время прокрутки окна просмотра обновляется единственный левый фрагмент преобразования куба.Вы можете видеть то, о чем я говорю, на этом изображении или на этом gif .Также вы можете клонировать проект по этой ссылке и посмотреть код самостоятельно.Каким-то образом он ведет себя по-разному, когда он проводит пальцем вправо и влево (я думал, что он должен вести себя по-одному, должен быть обновлен как левый, так и левый вид изображения параллакса).Как исправить это поведение?Или какой-нибудь ключ, чтобы исправить это самостоятельно.Код изображения параллакса взят из этого lib :
public class ScrollParallaxImageView extends ImageView implements ViewTreeObserver.OnScrollChangedListener {
private int[] viewLocation = new int[2];
private boolean enableScrollParallax = true;
private ParallaxStyle parallaxStyles;
public ScrollParallaxImageView(Context context) {
this(context, null);
}
public ScrollParallaxImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ScrollParallaxImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
if (!enableScrollParallax || getDrawable() == null) {
super.onDraw(canvas);
return;
}
if (parallaxStyles != null){
getLocationInWindow(viewLocation);
parallaxStyles.transform(this, canvas, viewLocation[0], viewLocation[1]);
}
super.onDraw(canvas);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
getViewTreeObserver().addOnScrollChangedListener(this);
}
@Override
protected void onDetachedFromWindow() {
getViewTreeObserver().removeOnScrollChangedListener(this);
super.onDetachedFromWindow();
}
@Override
public void onScrollChanged() {
if (enableScrollParallax) {
invalidate();
}
}
public void setParallaxStyles(ParallaxStyle styles) {
if (parallaxStyles != null) {
parallaxStyles.onDetachedFromImageView(this);
}
parallaxStyles = styles;
parallaxStyles.onAttachedToImageView(this);
}
public void setEnableScrollParallax(boolean enableScrollParallax) {
this.enableScrollParallax = enableScrollParallax;
}
public interface ParallaxStyle {
void onAttachedToImageView(ScrollParallaxImageView view);
void onDetachedFromImageView(ScrollParallaxImageView view);
void transform(ScrollParallaxImageView view, Canvas canvas, int x, int y);
}
}
Преобразование параллакса происходит в этом классе:
public class VerticalMovingStyle implements ScrollParallaxImageView.ParallaxStyle {
@Override
public void onAttachedToImageView(ScrollParallaxImageView view) {
// only supports CENTER_CROP
view.setScaleType(ImageView.ScaleType.CENTER_CROP);
}
@Override
public void onDetachedFromImageView(ScrollParallaxImageView view) {
}
@Override
public void transform(ScrollParallaxImageView view, Canvas canvas, int x, int y) {
if (view.getScaleType() != ImageView.ScaleType.CENTER_CROP) {
return;
}
// image's width and height
int iWidth = view.getDrawable().getIntrinsicWidth();
int iHeight = view.getDrawable().getIntrinsicHeight();
if (iWidth <= 0 || iHeight <= 0) {
return;
}
// view's width and height
int vWidth = view.getWidth() - view.getPaddingLeft() - view.getPaddingRight();
int vHeight = view.getHeight() - view.getPaddingTop() - view.getPaddingBottom();
// device's height
int dHeight = view.getResources().getDisplayMetrics().heightPixels;
if (iWidth * vHeight < iHeight * vWidth) {
// avoid over scroll
if (y < -vHeight) {
y = -vHeight;
} else if (y > dHeight) {
y = dHeight;
}
float imgScale = (float) vWidth / (float) iWidth;
float max_dy = Math.abs((iHeight * imgScale - vHeight) * 0.5f);
float translateY = -(2 * max_dy * y + max_dy * (vHeight - dHeight)) / (vHeight + dHeight);
canvas.translate(0, translateY);
}
}
}