ViewPager с CubeOutTransformation и эффектом параллакса - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть просмотрщик с фрагментами.Каждый фрагмент содержит 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);
        }
    }
}
...