Подтвердить что ты не робот

Android RelativeLayout выравнивает центр одного вида в правом верхнем углу другого вида

У меня есть опыт работы с RelativeLayout, но я никогда не сталкивался с проблемой решения проблемы, которую я представляю (кроме жестких значений поля кодирования, чего я хочу избежать).

Я хочу попытаться создать что-то вроде следующего изображения в RelativeLayout:

enter image description here

Коробка - это собственный вид, и я хочу получить представление, содержащее оранжевый круг, который будет расположен в верхнем правом углу окна просмотра, который содержит синий квадрат.

Я пробовал с android:alignTop="boxView" и android:alignRight="boxView", но это полностью помещало мой оранжевый круг в мою коробку. Я хочу, чтобы это было так, чтобы круг был центрирован над верхним правым углом окна.

Кто-нибудь знает, как я могу получить этот результат с RelativeLayout? предпочтительно без необходимости жесткого кодирования полей от края экрана для просмотра оранжевой точки.

4b9b3361

Ответ 1

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

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"
            android:background="#0000FF"
            android:orientation="vertical" >
        </LinearLayout>

        <LinearLayout
            android:layout_width="26dp"
            android:layout_height="26dp"
            android:layout_alignRight="@+id/linearLayout1"
            android:layout_alignTop="@+id/linearLayout1"
            android:layout_marginRight="-13dp"
            android:layout_marginTop="-13dp"
            android:background="#FF00FF"
            android:orientation="vertical" >
        </LinearLayout>

    </RelativeLayout>

Ответ 2

Вы можете использовать круговое позиционирование ConstraintLayout, просто выровняйте вид по углу 45 градусов и отрегулируйте радиус:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:background="@color/colorAccent"
        android:id="@+id/view"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <LinearLayout
        android:background="@color/colorPrimary"
        android:id="@+id/alignedView"
        android:layout_width="30dp"
        android:layout_height="30dp"
        app:layout_constraintCircle="@id/view"
        app:layout_constraintCircleAngle="45"
        app:layout_constraintCircleRadius="60dp" />

</androidx.constraintlayout.widget.ConstraintLayout>