【问题标题】:Fit ImageView to LinearLayout inside HorizontalScrollView使 ImageView 适合 Horizo​​ntalScrollView 内的 LinearLayout
【发布时间】:2016-04-14 13:12:01
【问题描述】:

嘿,我有一个 hor 滚动视图,其中包含一个 LinearLayout(方向:hor)。

     <HorizontalScrollView
        android:id="@+id/adImageScroller"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <LinearLayout
            android:id="@+id/adImageViewContainer"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:orientation="horizontal"
            android:layout_gravity="left"
            android:background="@color/material_blue_grey_950">
        </LinearLayout>

    </HorizontalScrollView>

我正在使用 ImageViews 动态填充此 LinearLayout(所有图像都有随机纵横比)。

这是填充 LinearLayout 的 onCreateView 方法:

for (int i = 0; i < reObjectPicUrls.size(); i++) {
        String url = reObjectPicUrls.get(i).getContent();
        ImageView imageView = new ImageView(getActivity());

        imageView.setId(i);
        imageView.setPadding(2, 2, 2, 2);
        new DownloadImageTask(imageView)
                .execute(url);
        imageView.setScaleType(ImageView.ScaleType.FIT_START); //<-- WORKS IN XML
        imageView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT)); //<-- WORKS IN XML
        imageViewContainer.addView(imageView);
}

我需要但没有得到的是将所有图像缩放到灰色区域的高度(horizo​​ntalScrollView 高度),同时保持它们的纵横比。

图片全部缩小为options.inSampleSize = 4;

问题在下图中。图像未缩放以适合 LinearLayout 的高度。

我尝试了不同的 scaleType,但似乎没有任何解决方法。 感谢您提供有关如何解决此问题的任何提示。

【问题讨论】:

  • 尝试为 imageview 指定最小高度
  • 好主意,但我需要支持多种屏幕尺寸,所以我使用 layout_weight 而不是 height。给出最小高度会提出最小高度应该是多少的问题。
  • 最小高度取决于您的屏幕尺寸...取设备高度宽度并除以 2 或 3,这将支持所有屏幕尺寸
  • 您将无法仅使用 xml 来实现,您应该根据图像大小设置 imageview 大小并使用 scaletype fitXY
  • 据我了解,如果我希望图像填充 LinearLayout 的高度(灰色区域),ImageView 的大小应该与 LinearLayout 匹配。在这种情况下,我无法根据图像大小设置 ImageView 高度。图片可以很小,但需要拉伸。

标签: android android-layout image-scaling


【解决方案1】:

终于破解了。 不必更改布局 xml,但确实更改了 onCreateView 代码并添加了 setAdjustViewBounds(true) 也使用了 FIT_CENTER 比例类型。

for (int i = 0; i < reObjectPicUrls.size(); i++) {
        String url = reObjectPicUrls.get(i).getContent();
        ImageView imageView = new ImageView(getActivity());

        imageView.setId(i);
        imageView.setPadding(2, 2, 2, 2);
        new DownloadImageTask(imageView)
                .execute(url);
        imageView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT));
        imageView.setAdjustViewBounds(true); <--- THIS DID THE TRICK
        imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);

        imageViewContainer.addView(imageView);
}

【讨论】: