Как динамически изменить размер ImageView в addOnScrollChangedListener? - PullRequest
0 голосов
/ 26 июня 2018

У меня проблема с изменением размера изображений через addOnScrollChangedListener. У меня есть их с setScaleType (ImageView.ScaleType.FIT_XY). Мой код:

final int[] last_scrollX = {width};

    hv.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
        @Override
        public void onScrollChanged() {
            //int scrollY = hv.getScrollY(); // For ScrollView
            int scrollX = hv.getScrollX(); // For HorizontalScrollView

            if(scrollX>last_scrollX[0]) {
                    IV_4.getLayoutParams().width = (int) (IV_4.getLayoutParams().width / 1.01);
                    IV_4.getLayoutParams().height = IV_4.getLayoutParams().width*2;
                    IV_2.getLayoutParams().width = (int) (IV_2.getLayoutParams().width * 1.01);
                    IV_2.getLayoutParams().height = IV_2.getLayoutParams().width*2;
                } else if (scrollX<last_scrollX[0]) {
                    IV_4.getLayoutParams().width = (int) (IV_4.getLayoutParams().width * 1.01);
                    IV_4.getLayoutParams().height = IV_4.getLayoutParams().width*2;
                    IV_2.getLayoutParams().width = (int) (IV_2.getLayoutParams().width / 1.01);
                    IV_2.getLayoutParams().height = IV_2.getLayoutParams().width*2;
                }
                last_scrollX[0]=scrollX;
        }
    });
}

Я хочу уменьшить и увеличить их размер, когда HorizontallScrollView hv прокручивает назад и вперед, но когда я прокручиваю, они не изменят свой размер. КОГДА я минимизирую приложение, а затем снова максимизирую его или фокусируюсь на редактировании текста в упражнении, изображения меняют свой размер (очень большой или очень маленький). РЕДАКТИРОВАТЬ: Забыл упомянуть, что эти изображения находятся в ConstraintLayout за прокруткой. Таким образом, они не находятся в просмотре прокрутки, следовательно, не в линейном макете. Вот что я получаю сейчас: https://image.ibb.co/naJiqT/ezgif_5_e9c1de6230.gif IV_4 - это левое изображение, а IV_2 - это правильное изображение, и я хочу, чтобы они меняли размер при прокрутке, но сейчас они меняются только тогда, когда я минимизирую / максимизирую приложение или когда я фокусируюсь текст редактирования. РЕДАКТИРОВАТЬ 2: Я вижу, как я могу сделать то, что я сделал до сих пор с преобразователем страниц, я никогда не использовал его, но насколько я могу видеть, будет очень трудно сделать изображения масштабируемыми + и - и изменяя их положение в то же время во время трансформации. Мне нужно понять, почему их размер не изменяется во время прокрутки, но когда я минимизирую / развертываю приложение или фокусирую текст редактирования, код onscrollchange показывает его изменения на изображениях.

1 Ответ

0 голосов
/ 27 июня 2018

Вы можете использовать ViewPager, чтобы получить тот же эффект с настраиваемым преобразователем страниц, подключенным к ViewPager

public class CustPagerTransformer implements ViewPager.PageTransformer {

private int maxTranslateOffsetX;
private ViewPager viewPager;

public CustPagerTransformer(Context context) {
    this.maxTranslateOffsetX = dp2px(context, 180);
}

public void transformPage(View view, float position) {
    if (viewPager == null) {
        viewPager = (ViewPager) view.getParent();
    }

    int leftInScreen = view.getLeft() - viewPager.getScrollX();
    int centerXInViewPager = leftInScreen + view.getMeasuredWidth() / 2;
    int offsetX = centerXInViewPager - viewPager.getMeasuredWidth() / 2;
    float offsetRate = (float) offsetX * 0.38f / viewPager.getMeasuredWidth();
    float scaleFactor = 1 - Math.abs(offsetRate);
    if (scaleFactor > 0) {
        view.setScaleX(scaleFactor);
        view.setScaleY(scaleFactor);
        view.setTranslationX(-maxTranslateOffsetX * offsetRate);
    }
}

/**
 * dp和像素转换
 */
private int dp2px(Context context, float dipValue) {
    float m = context.getResources().getDisplayMetrics().density;
    return (int) (dipValue * m + 0.5f);
}}

прикрепите это к viewpager как показано ниже

        viewPager.setPageTransformer(false, new CustPagerTransformer(HomeActivity.this));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...