如何动态更改 addOnScrollChangedListener 中 ImageView 的大小?
How to change size of ImageView in addOnScrollChangedListener dynamically?
我在通过 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;
}
});
}
我想在 HorizontalScrollView hv 来回滚动时减小和增大它们的大小,但是当我滚动时它们不会改变它们的大小。当我最小化应用程序然后再次最大化它或在 activity 中聚焦编辑文本时,图像会改变它们的大小(非常大或非常小)。
编辑:忘记提及这些图像位于滚动视图后面的 ConstraintLayout 中。所以它们不在滚动视图中,因此不在线性布局中。这就是我现在得到的:https://image.ibb.co/naJiqT/ezgif_5_e9c1de6230.gif IV_4 是左图,IV_2 是右图,我希望它们在滚动时改变大小,但现在它们只有在我 minimize/maximize 应用程序或当我关注编辑文本时。
EDIT2:我可以看到我如何使用页面转换器完成我迄今为止所做的事情,我从未使用过它,但据我所知,很难使图像缩放 + 和 - 并改变它们变换时同时定位。我需要了解为什么滚动时它们的大小不会改变,但是当我 minimize/maximize 应用程序或聚焦编辑文本时,onscrollchange 代码显示它在图像上的变化。
您可以使用 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));
我在通过 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;
}
});
}
我想在 HorizontalScrollView hv 来回滚动时减小和增大它们的大小,但是当我滚动时它们不会改变它们的大小。当我最小化应用程序然后再次最大化它或在 activity 中聚焦编辑文本时,图像会改变它们的大小(非常大或非常小)。 编辑:忘记提及这些图像位于滚动视图后面的 ConstraintLayout 中。所以它们不在滚动视图中,因此不在线性布局中。这就是我现在得到的:https://image.ibb.co/naJiqT/ezgif_5_e9c1de6230.gif IV_4 是左图,IV_2 是右图,我希望它们在滚动时改变大小,但现在它们只有在我 minimize/maximize 应用程序或当我关注编辑文本时。 EDIT2:我可以看到我如何使用页面转换器完成我迄今为止所做的事情,我从未使用过它,但据我所知,很难使图像缩放 + 和 - 并改变它们变换时同时定位。我需要了解为什么滚动时它们的大小不会改变,但是当我 minimize/maximize 应用程序或聚焦编辑文本时,onscrollchange 代码显示它在图像上的变化。
您可以使用 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));