将视图的垂直中心与另一个视图的顶部对齐

时间:2015-12-30 13:38:57

标签: android android-layout

看起来相当简单,但我似乎可以想出能够产生以下结果的xml :(关于SO的很多有趣的内容,但令人惊讶的是,我发现没有任何答案可以解决这个问题)

enter image description here

黑色视图是外框,蓝色视图与底部对齐,红色视图的垂直中心与蓝色视图的顶部对齐。

约束:

  • 不要假设红色视图具有固定大小(计算偏移边距的一半),
  • 不要以编程方式执行,xml rulez

编辑:修复混乱的描述并添加约束

2 个答案:

答案 0 :(得分:0)

如果浮动视图具有固定大小。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/a"
        android:layout_alignParentBottom="true"
        android:background="#44bb11"
        android:layout_width="match_parent"
        android:layout_height="100dp" />
    <ImageView
        android:layout_marginBottom="-40dp"
        android:layout_above="@+id/a"
        android:id="@+id/c"
        android:background="#45000000"
        android:layout_width="match_parent"
        android:layout_height="80dp" />
</RelativeLayout>

答案 1 :(得分:0)

如果您不能指望具有固定高度,则需要在确定高度时在运行时确定边距。否则,您需要硬编码底部边距,该底部边距是布局高度(蓝色布局)的一半的负值。我提供了两个嵌套布局,供您在主要活动布局中使用。

我在这个特定情况下使用了一个按钮来测试应用程序,你可以用你选择的任何方式实现它。将布局添加到xml的顺序将影响它们的可见性。将你想要的人放在最后一位是很重要的。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout ../..
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/black"
            tools:showIn="@layout/activity_main">

    <RelativeLayout android:id="@+id/l1"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:layout_alignParentBottom="true"
        android:background="@android:color/holo_blue_light"/>

    <RelativeLayout android:id="@+id/l2"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_above="@+id/l1"
        android:background="@android:color/holo_red_light"/>
</RelativeLayout>

我从this answer here借用了一种方法:

public void setMargin(View view) {
    if (relativeLayout
            .getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
        ViewGroup.MarginLayoutParams marginLayoutParams =
                (ViewGroup.MarginLayoutParams) relativeLayout
                        .getLayoutParams();
        int margin = relativeLayout.getHeight() / 2;
        marginLayoutParams.setMargins(20, 0, 0, -margin);
        relativeLayout.requestLayout();
    }
}

enter image description here

为了演示的目的,我在两个布局的两边都按了边距,这样你就可以看到它们重叠的位置。