Я заметил странное поведение в RelativeLayout
, когда вы выравниваете вид по стороне макета (любой стороне) и имеете большой запас в том же направлении.
У меня есть 2 RelativeLayouts
, каждый из которых содержит простое представление. В одном макете этот вид выравнивается по верхнему и левому краю, в другом — по нижнему и правому краю:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<RelativeLayout
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_marginTop="110dp"
android:layout_gravity="center"
android:background="#ff555555" >
<View
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:background="#aa8711" />
</RelativeLayout>
<RelativeLayout
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_marginBottom="110dp"
android:layout_gravity="center"
android:background="#ff555555" >
<View
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:background="#998877" />
</RelativeLayout>
</FrameLayout>
Это выглядит так:
Я добавил 130 dp поля в каждом направлении родительского выравнивания. Это означает, что вид должен быть виден в макете только частично. Вот что происходит:
Как видите, виды теперь меньше исходного размера, так как они отталкиваются от «стен» макета. Затем я попытался дать поле больше, чем макет, поэтому я дал им 151 dp поля в выровненных направлениях. Это выглядело так:
Вид, выровненный по нижнему правому краю, теперь «вырывается» из макета и снова имеет тот же размер, что и был изначально. С другой стороны, представление, выровненное по верхнему левому краю, также имеет исходный размер, но полностью находится внутри макета, а не за его пределами.
Я пробовал это индивидуально и в каждой перестановке выравнивания и получил те же результаты.
Вопрос 1. Кто-нибудь может объяснить это непоследовательное поведение?
Я попробовал то же самое, на этот раз сравнив поведение с поведением FrameLayout
. Начальная настройка:
и после полей:
FrameLayout
постоянно сохраняет вид в исходном размере и просто позволяет виду "выйти" из него. Я попытался дать отрицательный запас в противоположном направлении, по крайней мере, размер представления, который должен быть за пределами RelativeLayout
, и увидел то же поведение, что и в FrameLayout
по умолчанию.
Вопрос 2. Кто-нибудь может объяснить разницу в поведении и противоположный отрицательный эффект маржи?