RelativeLayout - CenterInParent и marginTop

У меня есть следующий XML:

<RelativeLayout android:id="@+id/cover_box"
    android:layout_width="wrap_content" android:layout_height="wrap_content">
    <ImageView android:id="@+id/cover"
        android:layout_width="wrap_content" android:layout_height="wrap_content" />
    <ImageView android:id="@+id/download" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:src="@drawable/mark_download"
        android:layout_centerInParent="true" android:layout_marginTop="90px" />
</RelativeLayout>

Но похоже, что marginTop игнорируется.

Ответ 1

Когда вы используете центр в родительском представлении, представление помещается непосредственно в центр. Верхняя граница поля будет действовать только в том случае, если объект находится в пределах 90 пикселей верхней части вашего представления. Таким образом, выталкивая центр вниз, чтобы удерживать на нем не менее 90 пикселей пространства. Таким образом, это не игнорируется, но оно не имеет эффекта, который, по вашему мнению, должен иметь.

Ответ 2

Если вы хотите, чтобы второе изображение было 90dp под центром экрана, вы можете заменить его на FrameLayout, где вы можете управлять дополнением для перемещения изображения вниз.

<FrameLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true"
    android:paddingTop="90dp">
    <ImageView android:id="@+id/download" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:src="@drawable/mark_download"/>
</FrameLayout>

Ответ 3

Я хочу, чтобы индикатор прогресса отображался под android:layout_centerInParent="true", поэтому я добавил фиктивный TextView и установил его в centerInParent. Затем я поместил под ним свой прогресс. Теперь вы можете увеличить расстояние от центра двумя способами. Сначала увеличьте marginTop в TextView и второй увеличивайте высоту TextView.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/widget"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/splash" >

    <FrameLayout
        android:id="@+id/splash_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <TextView
        android:id="@+id/txt1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />

    <com.s3.tdd.interfaces.CircularProgressBar
        android:id="@+id/circularprogressbar2"
        style="@style/Widget.ProgressBar.Holo.CircularProgressBar"
        android:layout_width="110dip"
        android:layout_height="110dip"
        android:layout_below="@+id/txt1"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

Ответ 4

Вы можете поместить свое изображение в другую ViewGroup (LinearLayout из RelativeLayout layout), оставив поле обзора изображения и сделав android:centerInParent="true" для ViewGroup:

<RelativeLayout 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:layout_width="wrap_content" android:layout_height="wrap_content" android:centerInParent="true">
           <ImageView android:id="@+id/download" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/mark_download" android:layout_marginTop="90px" />    
    </LinearLayout>    
</RelativeLayout>

Ответ 5

Вы можете сделать фиктивный вид и сосредоточить его на родительском. Теперь выровняйте свое представление относительно фиктивного представления с помощью макета: alignComponent и дайте marginTop. Теперь в коде переместите его в соответствии с шириной вашего представления, чтобы центрировать его.