如何在addOnScrollChangedListener中动态更改ImageView的大小?

时间:2018-06-26 20:22:16

标签: android android-scrollview

我在通过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;
        }
    });
}

当Horizo​​ntallScrollView hv来回滚动时,我想减小和增大它们的大小,但是当我滚动时,它们不会改变它们的大小。当我最小化该应用程序,然后再次最大化它或在活动中集中编辑文本时,图像会更改其大小(非常大或非常小)。 编辑:忘记提及这些图像在滚动视图后面的ConstraintLayout中。因此它们不在滚动视图中,因此不在线性布局中。这就是我现在得到的:https://image.ibb.co/naJiqT/ezgif_5_e9c1de6230.gif IV_4是左图,IV_2是右图,我希望它们在滚动时改变大小,但是现在它们仅在我最小化/最大化应用程序或聚焦时改变。 edittext。 EDIT2:我可以看到到目前为止如何使用页面转换器来完成我所做的事情,我从未使用过它,但是据我所知,要使图像缩放+和-并更改其大小将非常困难变换时同时定位。我需要了解为什么滚动时它们的大小不会改变,但是当我最小化/最大化应用程序或将edittext放在焦点上时,onscrollchange代码会显示图像上的变化。

1 个答案:

答案 0 :(得分:0)

您可以使用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));