如何防止在LinearLayout中缩小ImageView?

时间:2014-01-10 04:22:44

标签: android android-layout android-linearlayout android-imageview android-xml

我在Android应用程序中有一个行为不端的布局。现在,它看起来像这样:

enter image description here

这个想法是让3张图像的反射作为单独的图像排列在它们下面。如果我只有图像(只有第一个嵌套的LinearLayout,如下所示),那么图像显示就好了,它们的原始分辨率和均匀分布。但是,在(反射)中添加了第二个线性布局后,图像显示的范围要小得多。

图片中的那些反射图像显示正确的尺寸,图像应该与反射一样宽,原生。如果它们正确显示,那么反射底部的图像顶部应该填满屏幕的高度。但他们不是。我在imageviews和linearlayouts(也是不同的scaleTypes)上尝试了很多layout_width和layout_height的组合,但没有什么能阻止图像因某些原因而缩小。任何人都可以建议为什么?

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- IMAGES -->
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:weightSum="3">

        <ImageView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

        <ImageView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"" />

        <ImageView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

    </LinearLayout>

    <!-- IMAGE REFLECTIONS -->
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:weightSum="3">

        <ImageView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

        <ImageView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"" />

        <ImageView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

    </LinearLayout>

</LinearLayout>

此外,我并没有停止使用LinearLayouts,因此欢迎使用替代方案。

更新
这是它添加到每个ImageView的背景颜色的外观:

enter image description here

......这就是它应该看起来的样子。这是通过将每个海报ImageView的layout_width和layout_height分别设置为333px和500px来实现的。但我不想这样做。当屏幕上显示的图像少于3张时,它会导致海报和反射之间出现水平对齐问题:

enter image description here

6 个答案:

答案 0 :(得分:0)

尝试这样做,我只是为父线性布局增加了重量......

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <!-- IMAGES -->

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal"
        android:weightSum="3" >

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
    </LinearLayout>

    <!-- IMAGE REFLECTIONS -->

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal"
        android:weightSum="3" >

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
    </LinearLayout>

</LinearLayout>

答案 1 :(得分:0)

  • 将所有ImageView的layout_width更改为0px,例如:

    原因是,如果layout_width不是0(这取决于Android版本),android将不会调查layout_weight

  • 除此之外,请确保您的图片足够大(以像素为单位),如果您无法保证,您可能需要根据需要扩展ImageView:

    1. 你有一个固定的宽高比(最容易写)

      @Override
      protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
          super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(
                  (int) (MeasureSpec.getSize(widthMeasureSpec) * ASPECT_RATIO),
                  MeasureSpec.EXACTLY));
      }
      
    2. 您希望图片根据您的源图像的aspectratio调整它的高度(开始查看here

  • 根据您上面的决定设置scaleType(link

答案 2 :(得分:0)

试试这个,只需将ImageView的宽度设置为0dp即可。并且还要查看此链接LinearLayout to build a row of elements.,这对于进一步使用非常有用。

<!-- IMAGES -->
<LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="3">

    <ImageView 
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <ImageView 
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"" />

    <ImageView 
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

</LinearLayout>

<!-- IMAGE REFLECTIONS -->
<LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="3">

    <ImageView 
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <ImageView 
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"" />

    <ImageView 
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

</LinearLayout>

答案 3 :(得分:0)

我发布这个作为第二个答案,因为我假设错误在另一个部分: 您的屏幕高度可能不足以容纳正常图像+反射,因此第一行被压扁并且图像按比例缩小以匹配宽高比。尝试将其包装在ScrollView中,这应该可以解决问题,但可能不是您想要的结果。这是代码:

请注意,我将包装LinearLayout的layout_height更改为wrap_content

<?xml version="1.0" encoding="utf-8"?>

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

    <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        <!-- IMAGES -->
        <LinearLayout
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:weightSum="3">

            <ImageView
                    android:layout_width="0px"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"/>

            <ImageView
                    android:layout_width="0px"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"/>

            <ImageView
                    android:layout_width="0px"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"/>

        </LinearLayout>

        <!-- IMAGE REFLECTIONS -->
        <LinearLayout
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:weightSum="3">

            <ImageView
                    android:layout_width="0px"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"/>

            <ImageView
                    android:layout_width="0px"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"/>

            <ImageView
                    android:layout_width="0px"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"/>

        </LinearLayout>

    </LinearLayout>
</ScrollView>

答案 4 :(得分:0)

我找不到一种方法来完成这项工作,所以我最终只是明确地将海报的宽度和高度设置为它们的像素值。实际上我最终也完全采用了一种不同的,更简单的布局,一种是以RelativeLayout为根,包含六个ImageViews(3张海报及其反射)。尽管海报萎缩效应仍然存在。

如果有人知道如何解决这个问题,请告诉我。

答案 5 :(得分:0)

如果您的ImageView在加载电影海报图片之前显示占位符图像(例如在android:src属性中),则缩小的可能原因是您的占位符图像与电影的宽高比不同海报图片。

ImageView中似乎存在一个错误,有时图像会调整为与占位符图像相同的宽高比。

尝试将占位符图片的大小调整为与电影海报图片相同的宽高比。