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

Как установить фиксированное соотношение сторон для макета в Android

Я пытаюсь установить ширину макета на "fill_parent", имея высоту представления той же длины, чтобы сделать макет квадратом.

Любые предложения будут оценены, спасибо заранее!: D

4b9b3361

Ответ 1

С введением ConstraintLayout вам не нужно писать ни одну строку кода, ни использовать сторонние пользователи или полагаться на PercentFrameLayout которые устарели в 26.0.0.

Вот пример того, как сохранить соотношение сторон 1:1 для вашего макета с помощью ConstraintLayout:

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginEnd="0dp"
        android:layout_marginStart="0dp"
        android:layout_marginTop="0dp"
        android:background="@android:color/black"
        app:layout_constraintDimensionRatio="H,1:1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

    </FrameLayout>

</android.support.constraint.ConstraintLayout>

Или вместо редактирования вашего XML файла вы можете отредактировать макет непосредственно в редакторе макетов:

Редактор макета

Ответ 2

В файле build.gradle добавьте:

compile 'com.android.support:percent:23.1.1'

а в вашем layout.xml wrap любой вид или группу просмотра вы хотите следовать соотношению внутри PercentFrameLayout, где:

android:layout_width="match_parent"
android:layout_height="wrap_content"

а затем для группы просмотра или просмотра вы хотите следовать соотношению заменить android: layout_width и android: layout_height:

    app:layout_aspectRatio="178%"
    app:layout_widthPercent="100%"

и у вас есть группа просмотра или просмотра, где соотношение сторон составляет 16: 9 (1.78: 1) с шириной, соответствующей родительской и соответствующей высоте.

Примечание. Важно удалить обычные свойства ширины и высоты. Линт будет жаловаться, но он будет работать.

Ответ 3

Сначала вы можете попробовать установить layout_height на wrap_content. Но оттуда я думаю, что вам нужно идти в код. Просто экспериментируйте, в своей деятельности попробуйте что-то вроде:

@Override
public void onResume(){
    super.onResume();
    findViewById(R.id.squareView).getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override public void onGlobalLayout() {
            View squareView = findViewById(R.id.squareView);
            LayoutParams layout = squareView.getLayoutParams();
            layout.height = squareView.getWidth();
            squareView.setLayoutParams(layout);
            squareView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        }
    });
}

Где R.id.squareView - id рассматриваемого вида. Обратите внимание: этот код завернут в вызов onGlobalLayout, чтобы гарантировать, что squareView.getWidth() имеет значимое значение.

Ответ 4

Я создал библиотеку макетов для аналогичного варианта использования. Не стесняйтесь использовать его.

RatioLayouts

Установка

Добавьте это в начало файла

repositories {
    maven {
        url  "http://dl.bintray.com/riteshakya037/maven" 
    }
}


dependencies {
    compile 'com.ritesh:ratiolayout:1.0.0'
}

Использование

Определить пространство имен приложения в корневом представлении в вашем макете

xmlns:app="http://schemas.android.com/apk/res-auto"

Включите эту библиотеку в макет

<com.ritesh.ratiolayout.RatioRelativeLayout
        android:id="@+id/activity_main_ratio_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:fixed_attribute="WIDTH" // Fix one side of the layout 
        app:horizontal_ratio="2" // ratio of 2:3
        app:vertical_ratio="3">

Ответ 5

LinearLayout ll = (LinearLayout)findViewById(R.id.LL);


int width = ll.getWidth();
LinearLayout.LayoutParams ll_params = new LinearLayout.LayoutParams(width, width);
ll.setLayoutParams(ll_params);

Ответ 6

установите высоту как fill_parent, ширина как wrap_content

и вы фиксируете соотношение сторон с android:adjustViewBounds="true"