ConstraintLayout을 백분율 값으로 작동시키는 방법은 무엇입니까?


207

Android Studio 2.2의 미리보기 1을 통해 Google은 지원 라이브러리에 새로운 레이아웃을 출시했습니다 ConstraintLayout. ConstraintLayout을 사용하면 Android Studio에서 디자인 도구를 사용하는 것이 더 쉽지만 LinearLayout과 같은 상대 크기 (백분율 또는 '무게')를 사용하는 방법을 찾지 못했습니다. 퍼센트를 기준으로 제약 조건을 정의하는 방법이 있습니까? 예를 들어보기에서 화면의 40 %를 차지하고,보기 사이에 20 %의 여백을 만들고,보기의 너비를 다른보기의 너비의 50 %로 설정 하시겠습니까?


3
너비 또는 높이에 대한 비율 지원 version 1.1이 ConstraintLayout 에 추가되었습니다 . 참조 "백분율 차원"developer.android.com/reference/android/support/constraint/... 또는 새로운 몇 가지 답변.
sunadorer

답변:


225

현재 몇 가지 방법으로이 작업을 수행 할 수 있습니다.

하나는 지침을 작성하는 것입니다 (디자인 영역을 마우스 오른쪽 버튼으로 클릭 한 후 수직 / 가로 지침 추가 클릭). 그런 다음 가이드 라인의 "헤더"를 클릭하여 위치를 백분율을 기준으로 변경하십시오. 마지막으로 뷰를 지침으로 제한 할 수 있습니다.

다른 방법은 바이어스 (백분율)를 사용하여 뷰를 배치 한 다음 다른 뷰를 해당 뷰에 고정하는 것입니다.

즉, 비율 기반 측정 기준을 제공하는 방법에 대해 생각하고 있습니다. 약속 할 수는 없지만 추가하고 싶은 것입니다.


1
0 다운 투표 후속 조치를 요청할 수 있습니까? ImageView를 60 % 너비로 설정하려고하지만 16 : 9 종횡비를 유지하려고합니다. 너비를 고정하고 싶지만 ImageView의 높이는 동적입니다. ConstraintLayout으로 가능합니까? 하드 코드 된 치수를 지정하지 않으면 고정 너비 / 높이 값이 0으로 끝납니다.
MattWilliams89

3
@ MattWilliams89 layout_constraintDimensionRatio라는 매개 변수가 있습니다. 귀하의 경우에는 유용 ​​할 것입니다. "16 : 9"를 작성하십시오. 그래도 난 그것으로 레이아웃을 구축을 위해 노력하고 성공하지 못했습니다 이미지가 큰 얻는다
Yury하기 Fedorov

1
@RomainGuy guidlines의 헤더에서 위치를 백분율로 어떻게 변경합니까? 나는 그것을 마우스 오른쪽 버튼으로 클릭하려고했는데 아무것도 표시되지 않습니다
Edijae Crusar

21
가이드 라인의 헤더가 정확히 무엇인지 궁금해하는 사람들에게는 위쪽 또는 아래쪽 화살표 또는 백분율 기호가있는 원입니다. 클릭하면 XML에서 app : layout_constraintGuide_begin, app : layout_constraintGuide_end 및 app : layout_constraintGuide_percent간에 전환됩니다. 작은 문제가 발생했습니다 (ConstraintLayout 버전 1.0.0-alpha8에서 가이드 라인을 클릭하고 마우스를 누른 상태에서 원으로 드래그하여 편집기에서 전환해야하지만이 버그가 곧 수정 될 것이라고 확신합니다) .
루 스틱

4
다음을 사용하여 레이아웃의 XML에서 이것을 설정할 수도 있습니다.app:layout_constraintGuide_percentage
piratemurray

215

여기서 빠른 참조를하는 것이 유용 할 수 있습니다.

뷰 배치

다음 과 같은 지침 을 사용하십시오 app:layout_constraintGuide_percent.

<androidx.constraintlayout.widget.Guideline
    android:id="@+id/guideline"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.5"/>

그런 다음이 지침을 다른 뷰의 기준점으로 사용할 수 있습니다.

또는

사용 가능한 공간이 허용 될 때 및 / 또는 바이어스 를 사용 하여 뷰 위치 수정app:layout_constraintHorizontal_biasapp:layout_constraintVertical_bias

<Button
    ...
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintHorizontal_bias="0.25"
    ...
    />

조회수

또 다른 퍼센트 기반 값은 요소의 높이 및 / 또는 너비이며 app:layout_constraintHeight_percent및 / 또는 app:layout_constraintWidth_percent:

<Button
    ...
    android:layout_width="0dp"
    app:layout_constraintWidth_percent="0.5"
    ...
    />

3
너비가 1dp로 설정된 이유는 무엇입니까?
user924

1
@ user924 가이드 라인에 0dp의 너비를 부여하는 것이 합리적 일 것입니다.이를 구현 한 개발자가 1dp를 결정한 이유를 모르겠습니다. 가중치를 사용할 때 0dp가 "스트레치"로 간주되기 때문일 수 있습니다.
Amir Uval

3
@ user924 : 0dp는 동적 크기 조정을 나타 내기 위해 ConstraintLayout에서 사용됩니다. developer.android.com/reference/android/support/constraint/…
serv-inc

1
@ serv-inc 그러나 여기 1dp0dp.. 그것은 내가 말하는 것입니다
user924

3
@ user924 : 너비로 설정해야합니다. 0dp이미 예약되어 있으므로 1dp합리적인 것으로 보입니다.
serv-inc

109

"ConstraintLayout1.1.0-beta1"기준으로 퍼센트를 사용하여 너비와 높이를 정의 할 수 있습니다.

android:layout_width="0dp"
app:layout_constraintWidth_default="percent"
app:layout_constraintWidth_percent=".4"

너비를 화면 너비의 40 %로 정의합니다. 이 백분율과 지침을 백분율로 조합하면 원하는 백분율 기반 레이아웃을 만들 수 있습니다.


6
구속 조건 레이아웃 1.0.2에서 layout_constraintWidth_default백분율 값 은 지원되지 않습니다. 올바른 방법은 가이드 라인을 사용하는 것입니다.
vovahost

1
그것은 안드로이드 Studio와 함께 일하고 3.0 2017년 10월 20일에 내장
douarbou

5
답변에서 언급했듯이 이것은 version 1.1ConstraintLayout 에 추가되었습니다 . 추가는 _default="percent"없는 안정된 버전에 더 이상 필요합니다! developer.android.com/reference/android/support/constraint/…의 "퍼센트 치수" 를 참조하십시오.
sunadorer

@hoford, 크기가 sp단위 로 정의되는 텍스트를 포함하는 View의 경우 텍스트 크기 를보기 크기에 자동 비례하는 방법 (즉, 레이아웃의 총 크기에 비례하여 정의되는 방법, 즉 '백분율') ?
Bliss

77

ConstraintLayout v1.1의 새로운 릴리스로 다음을 수행 할 수 있습니다.

<Button
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintHeight_percent="0.2"
app:layout_constraintWidth_percent="0.65" />

이렇게하면 버튼이 부모보기 너비의 20 %, 너비의 65 %로 제한됩니다.


1
나를 위해 "android :"에서 "app :"로 변경했을 때만 일했습니다.-> app : layout_constraintHeight_percent = "0.2"
Kirill Karmazin

머티리얼 디자인의 유동적 인 레이아웃을 따를 때 이것은 필수입니다. material.io/design/layout/…

@Adam, 크기가 sp단위 로 정의되는 텍스트를 포함하는 View의 경우 텍스트 크기 를보기 크기에 자동 비례하는 방법 (즉, 레이아웃의 총 크기에 비례하여 정의되는 방법, 즉 '백분율') ?
Bliss

1
이 같은 @Bliss 사운드가 도움이 될 수 : developer.android.com/guide/topics/ui/look-and-feel/... 내가 비록 나 자신을 사용한 적이있다.
Adam

43

지침을 사용하는 방법

채택 된 답변은 지침을 사용하는 방법과 "헤더"가 무엇인지에 대해 조금 불분명합니다.

단계

먼저 가이드 라인을 추가하십시오.

여기에 이미지 설명을 입력하십시오

구속 조건을 표시하려면 길드 라인을 선택하거나 조금 움직입니다.

여기에 이미지 설명을 입력하십시오

그런 다음 둥근 원 ( "머리글")이 백분율이 될 때까지 클릭하십시오. 그런 다음이 백분율을 50 % 또는 원하는 값으로 끌어 올 수 있습니다.

여기에 이미지 설명을 입력하십시오

그런 다음 뷰를 가이드 라인으로 제한하여 뷰의 부모 비율을 일정 비율로 만들 수 match_constraint있습니다.

여기에 이미지 설명을 입력하십시오


'헤더'는 어디에 표시되어야합니까? 내 견해로는 표시되지 않습니다.
Marcel50506

@ Marcel50506에서 Design 및 Blueprint 뷰가 모두 표시되는지 확인하십시오. 그것은 당신에게 그것을 볼 수있는 가장 좋은 기회를 줄 것입니다. 가이드 라인이 보이면 클릭하여 가이드 라인을 선택하십시오. 라인이 보이지 않으면 컴포넌트 트리 메뉴에서 왼쪽으로 꺼져 있어야하는 가이드 라인 항목을 클릭 해보십시오 (가이드 라인을 이미 추가했다고 가정).
Suragch

1
원은 보이지 않지만 안내 선의 왼쪽을 클릭하면 백분율로 변경할 수 있습니다. 렌더링 문제 생각합니다. 감사합니다.
Marcel50506

더 나은 레이아웃 접근 방식을 제안하기 때문에 이것이 가장 좋은 대답입니다. 뷰 하나에 비율을 추가하는 대신 기본 지침에서 여러 뷰를 정렬 할 수 있습니다.
Nguyen Minh Hien

33

가이드 라인은 매우 귀중합니다. app : layout_constraintGuide_percent는 훌륭한 친구입니다. 그러나 때때로 우리는 가이드 라인없이 백분율을 원합니다. 이제 가중치 를 사용할 수 있습니다 :

android:layout_width="0dp"
app:layout_constraintHorizontal_weight="1"

다음은 추가 가중치 가있는 가이드 라인을 사용하는보다 완전한 예입니다 .

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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"
    android:padding="16dp"
    tools:context="android.itomerbu.layoutdemo.MainActivity">

    <android.support.constraint.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.44"/>

    <Button
        android:id="@+id/btnThird"
        android:layout_width="0dp"
        app:layout_constraintHorizontal_weight="1"
        android:layout_height="wrap_content"
        android:text="@string/btnThird"
        app:layout_constraintLeft_toLeftOf="parent"
        android:layout_marginBottom="8dp"
        app:layout_constraintRight_toLeftOf="@+id/btnTwoThirds"
        app:layout_constraintBottom_toTopOf="@+id/guideline"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"/>

    <Button
        android:id="@+id/btnTwoThirds"
        app:layout_constraintHorizontal_weight="2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="@string/btnTwoThirds"
        app:layout_constraintBottom_toBottomOf="@+id/btnThird"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintLeft_toRightOf="@+id/btnThird"/>
</android.support.constraint.ConstraintLayout>

2
@Plumbus-가중치는 백분율과 같습니다 (모든 백분율은 수학적으로 가중치로 변환 할 수 있으며 그 반대도 가능). 용어에 대해 까다로워서 답의 요점을 놓치게됩니다.
Scott Biggs

11

ConstraintLayout v1.1.2를 사용하면 차원 0dp을 설정 한 다음 layout_constraintWidth_percent또는 layout_constraintHeight_percent속성을 0과 1 사이의 값 으로 설정해야합니다 .

<!-- 50% width centered Button -->
<Button
    android:id="@+id/button"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintWidth_percent=".5" />

( ConstraintLayout 1.1.2 app:layout_constraintWidth_default="percent"이상 을 설정할 필요가 없습니다 app:layout_constraintHeight_default="percent")


10

구속 조건 레이아웃 1.0보기는 두 가지 지침을 만드는 데 필요한 화면의 비율을 차지합니다. 구속 조건 레이아웃 1.1에서는 뷰를 백분율 너비 또는 높이로 쉽게 제한 할 수있어 더욱 간단 해졌습니다.

여기에 이미지 설명을 입력하십시오

환상적이지 않습니까? 모든 뷰는 layout_constraintWidth_percent 및 layout_constraintHeight_percent 속성을 지원합니다. 이로 인해 사용 가능한 공간의 백분율로 구속 조건이 고정됩니다. 따라서 몇 줄의 XML을 사용하여 Button 또는 TextView를 확장하여 화면의 일부를 채울 수 있습니다.

예를 들어, 버튼의 너비를 화면의 70 %로 설정하려면 다음과 같이하십시오.

<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_constraintWidth_percent="0.7" />

android : layout_width를 0dp에 0dp로 지정 했으므로 차원을 0dp에 백분율로 사용해야합니다.

마찬가지로 버튼의 높이를 화면의 20 %로 설정하려면 다음과 같이하면됩니다.

<Button
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_constraintHeight_percent="0.2" />

보다! 버튼으로 높이를 백분율로 사용하기를 원하므로 이번에는 android : layout_height를 0dp로 지정했습니다.


8

이 코드를 사용해보십시오. app : layout_constraintHeight_percent 및 app : layout_constraintWidth_percent를 사용하여 높이 및 너비 백분율을 변경할 수 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="#FF00FF"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHeight_percent=".6"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintWidth_percent=".4"></LinearLayout>

</android.support.constraint.ConstraintLayout>

그레들 :

dependencies {
...
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
}

여기에 이미지 설명을 입력하십시오


7

에서 app:layout_constraintVertical_weight와 같이 사용할 수 있습니다layout_weightlinearlayout

<android.support.constraint.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">

<Button
    android:id="@+id/button4"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="Button"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toLeftOf="@+id/button5"
    app:layout_constraintVertical_weight="1"/>

<Button
    android:id="@+id/button5"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="Button"
    app:layout_constraintLeft_toRightOf="@+id/button4"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintVertical_weight="1"/>
</android.support.constraint.ConstraintLayout>

참고 : app:layout_constraintVertical_weight( app:layout_constraintHorizontal_weight)는 android:layout_width="0dp"(android:layout_height="0dp"


5

유용하다고 생각되는 사람에게는 layout_constraintDimensionRatio내부의 모든 자식보기를 사용할 ConstraintLayout수 있으며 높이 또는 너비를 다른 치수의 비율로 정의 할 수 있습니다 (적어도 하나는 너비 또는 높이가 0dp 여야합니다).

 <ImageView
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:src="@drawable/top_image"
        app:layout_constraintDimensionRatio="16:9"        
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>

이 경우 화면 비율은 16입니다 : 9 app:layout_constraintDimensionRatio="16:9" 당신이 더 많은 정보를 찾을 수 있습니다 여기에


3

나는 이것이 OP가 원래 요청한 것이 아니라는 것을 알고 있지만 비슷한 질문이있을 때이 상황에서 많은 도움이되었습니다. 코드를 통해 레이아웃 창 크기 (정기적으로 사용)를 변경하려는 사람들을 위해 이것을 추가 . 질문 활동에 onCreate에 추가하십시오. (80 %로 변경)

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);

int width = dm.widthPixels;
int height = dm.heightPixels;

getWindow().setLayout((int)(width * 0.8), (int)(height * 0.8));

2

간단히 가이드 라인 태그에서을 교체하십시오.

app:layout_constraintGuide_begin="291dp"

app:layout_constraintGuide_percent="0.7"

0.7은 70 %를 의미합니다.

또한 이제 지침을 끌려고하면 끌린 값이 % age에 표시됩니다.


2

가이드 라인을 사용하여 위치를 백분율 기반으로 변경할 수 있습니다

<android.support.constraint.Guideline
android:id="@+id/guideline"
android:layout_width="1dp"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5"/>

이 방법으로도 사용할 수 있습니다

android:layout_width="0dp"
app:layout_constraintWidth_default="percent"
app:layout_constraintWidth_percent="0.4"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.