约束布局获取imageview的默认上边距

时间:2017-08-07 19:38:24

标签: android android-layout android-imageview android-constraintlayout

我正在尝试使用约束布局创建布局,顶部是ImageView,ImageView中有一个按钮,下面是TextView,然后是下面的另一个TextView。以下是xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    app:cardElevation="4dp">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/white">
        <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <ImageView
                android:id="@+id/news_image1"
                android:layout_width="0dp"
                android:layout_height="0dp"
                app:layout_constraintDimensionRatio="16:9"
                android:scaleType="centerCrop"
                android:adjustViewBounds="true"
                app:layout_constraintTop_toTopOf="parent"
                android:layout_marginTop="0dp"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintBottom_toTopOf="@+id/news_title1"/>
            <ImageButton
                android:id="@+id/news_share_button_1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@android:color/transparent"
                android:src="@drawable/share_button_big"
                app:layout_constraintBottom_toBottomOf="@+id/news_image1"
                app:layout_constraintRight_toRightOf="@+id/news_image1"
                android:layout_marginRight="15dp"
                android:layout_marginEnd="15dp"/>
            <TextView
                android:id="@+id/news_title1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:gravity="center_vertical|start"
                android:layout_alignParentBottom="true"
                android:lines="3"
                android:ellipsize="end"
                app:layout_constraintTop_toBottomOf="@+id/news_image1"
                app:layout_constraintBottom_toTopOf="@+id/news_read_more1"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                android:textColor="@color/colorPrimaryText"
                android:layout_margin="@dimen/news_cell0_textview_margin"
                android:textSize="12sp"
                android:typeface="monospace" />
            <TextView
                android:id="@+id/news_read_more1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:gravity="center_vertical|start"
                android:layout_alignParentBottom="true"
                android:lines="1"
                android:ellipsize="end"
                app:layout_constraintTop_toBottomOf="@+id/news_title1"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                android:textColor="@color/read_more_text_color"
                android:text="@string/news_read_more"
                android:layout_margin="@dimen/news_cell0_textview_margin"
                android:textSize="10sp" />
        </android.support.constraint.ConstraintLayout>
    </RelativeLayout>
</android.support.v7.widget.CardView>

除了第一个ImageView顶部的小边距外,一切都是正确的。无论我做什么,我都无法摆脱这种差距。见下图。

enter image description here

请注意ImageView顶部和卡片之间的边距,这让我很烦恼。

3 个答案:

答案 0 :(得分:3)

您的news_imagenews_title1news_read_more1观点构成了一个链条。显然,虽然我找不到相关的文档,但垂直链中的所有视图都将共享垂直边距。换句话说,将layout_marginToplayout_marginBottom属性应用于这三个视图中的一个将最终将其应用于所有三个

你必须重新分配你的边距,记住这一点。

修改

看起来这种行为比我想象的要复杂一些。首先,它看起来只适用于spread“链式”(默认情况下)的视图。其次,看起来上边距应用于指定的视图以及上面的所有视图链中的那个视图,而底边距应用于指定的视图以及所有视图下面链中的那个。最后,看起来边距是累积的(所以如果你的底部视图有10dp的上边距,中间视图上有20dp的上边距,最终结果将是你的顶视图30dp,中间视图30dp,你的10dp)底视图)。

至于在特定情况下如何解决这个问题?您应该可以使用左/右边距而不会出现问题。然后可能你应该在顶视图上使用底部边距来分隔三个视图。

编辑#2

Muthukrishnan的回答让我意识到你可以通过简单地从你的观点中删除链来解决这个问题。如果从ImageView中删除app:layout_constraintBottom_toTopOf="@+id/news_title1"约束,则会破坏链,现在不会共享垂直边距。

答案 1 :(得分:1)

试试这个,我删除你的布局中的app:layout_constraintTop_toTopOf="parent"

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    app:cardElevation="4dp">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/white">
        <android.support.constraint.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <ImageView
                android:id="@+id/news_image1"
                android:layout_width="0dp"
                android:layout_height="0dp"
                app:layout_constraintDimensionRatio="16:9"
                android:scaleType="centerCrop"
                android:adjustViewBounds="true"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"/>
            <ImageButton
                android:id="@+id/news_share_button_1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@android:color/transparent"
                android:src="@drawable/ic_menu_share"
                app:layout_constraintBottom_toBottomOf="@+id/news_image1"
                app:layout_constraintRight_toRightOf="@+id/news_image1"
                android:layout_marginRight="15dp"
                android:layout_marginEnd="15dp"/>
            <AliasTextView
                android:id="@+id/news_title1"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:gravity="center_vertical|start"
                android:layout_alignParentBottom="true"
                android:lines="3"
                android:ellipsize="end"
                app:layout_constraintTop_toBottomOf="@+id/news_image1"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                android:textColor="@color/colorPrimaryText"
                android:layout_margin="@dimen/news_cell0_textview_margin"
                android:textSize="12sp"
                android:typeface="monospace" />
            <TextView
                android:id="@+id/news_read_more1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:gravity="center_vertical|start"
                android:layout_alignParentBottom="true"
                android:lines="1"
                android:ellipsize="end"
                app:layout_constraintTop_toBottomOf="@+id/news_title1"
                app:layout_constraintLeft_toLeftOf="parent"
                android:textColor="@color/read_more_text_color"
                android:text="@string/news_read_more"
                android:layout_margin="@dimen/news_cell0_textview_margin"
                android:textSize="10sp" />
        </android.support.constraint.ConstraintLayout>
    </RelativeLayout>
</android.support.v7.widget.CardView>

答案 2 :(得分:1)

感谢Ben P的出色启动,我设法找到了解决方案。 ConstraintLayout中有三种(加一种称重)链接样式。根据{{​​3}},链式样式解释为:

  1. 点差:视图均匀分布。例如。 app:layout_constraintHorizontal_chainStyle=”spread” app:layout_constraintVertical_chainStyle=”spread”
  2. 传播:第一个和最后一个视图附加在链的每一端的约束上,其余视图均匀分布。例如。 app:layout_constraintHorizontal_chainStyle=”spread_inside” app:layout_constraintVertical_chainStyle=”spread_inside”
  3. 已打包:视图被打包在一起(在考虑边距后)。然后,您可以通过更改链的头部视图偏差来调整整个链的偏差(左/右或上/下)。例如。 app:layout_constraintHorizontal_chainStyle=”packed” app:layout_constraintVertical_chainStyle=”packed”
  4. 加权:当链设置为展开或展开时,您可以通过将一个或多个视图设置为“匹配约束”(0dp)来填充剩余空间。默认情况下,空间均匀分布在每个视图之间,这些视图设置为&#34;匹配约束,&#34;但您可以使用thelayout_constraintHorizontal_weightlayout_constraintVertical_weight attributes为每个视图指定重要性权重。如果您在线性布局中熟悉layout_weight,则其工作方式相同。因此,具有最高权重值的视图获得最大的空间;具有相同权重的视图获得相同的空间量。
  5. spread是默认的链接样式。我将其更改为spread_inside,以便将第一个和最后一个视图附加到链的每一端的约束上(因此服从所提供的边距)。 xml现在看起来像:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v7.widget.CardView
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        app:cardElevation="4dp">
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/white">
            <android.support.constraint.ConstraintLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <ImageView
                    android:id="@+id/news_image1"
                    android:layout_width="0dp"
                    android:layout_height="0dp"
                    app:layout_constraintDimensionRatio="16:9"
                    android:scaleType="centerCrop"
                    android:adjustViewBounds="true"
                    app:layout_constraintTop_toTopOf="parent"
                    android:layout_marginTop="0dp"
                    app:layout_constraintVertical_chainStyle="spread_inside"
                    app:layout_constraintRight_toRightOf="parent"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintBottom_toTopOf="@+id/news_title1"/>
                <ImageButton
                    android:id="@+id/news_share_button_1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:background="@android:color/transparent"
                    android:src="@drawable/share_button_big"
                    app:layout_constraintBottom_toBottomOf="@+id/news_image1"
                    app:layout_constraintRight_toRightOf="@+id/news_image1"
                    android:layout_marginRight="15dp"
                    android:layout_marginEnd="15dp"/>
                <TextView
                    android:id="@+id/news_title1"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_centerHorizontal="true"
                    android:gravity="center_vertical|start"
                    android:layout_alignParentBottom="true"
                    android:lines="3"
                    android:ellipsize="end"
                    app:layout_constraintVertical_chainStyle="spread_inside"
                    app:layout_constraintTop_toBottomOf="@+id/news_image1"
                    app:layout_constraintBottom_toTopOf="@+id/news_read_more1"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintRight_toRightOf="parent"
                    android:textColor="@color/colorPrimaryText"
                    android:layout_margin="@dimen/news_cell0_textview_margin"
                    android:textSize="12sp"
                    android:typeface="monospace" />
                <TextView
                    android:id="@+id/news_read_more1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerHorizontal="true"
                    android:gravity="center_vertical|start"
                    android:layout_alignParentBottom="true"
                    android:lines="1"
                    android:ellipsize="end"
                    app:layout_constraintVertical_chainStyle="spread_inside"
                    app:layout_constraintTop_toBottomOf="@+id/news_title1"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintLeft_toLeftOf="parent"
                    android:textColor="@color/read_more_text_color"
                    android:text="@string/news_read_more"
                    android:layout_margin="@dimen/news_cell0_textview_margin"
                    android:textSize="10sp" />
            </android.support.constraint.ConstraintLayout>
        </RelativeLayout>
    </android.support.v7.widget.CardView>