Làm cách nào để ConstraintLayout hoạt động với giá trị phần trăm?


206

Với Bản xem trước 1 của Android Studio 2.2, Google đã phát hành bố cục mới trong thư viện hỗ trợ của mình : ConstraintLayout. Với ConstraintLayout, việc sử dụng công cụ Thiết kế trong Android Studio sẽ dễ dàng hơn, nhưng tôi không tìm thấy cách sử dụng kích thước tương đối (phần trăm hoặc 'trọng lượng' như trong linearLayout). Có cách nào để xác định các ràng buộc dựa trên phần trăm không? Ví dụ: tạo Chế độ xem chiếm 40% màn hình, tạo tỷ lệ 20% giữa các lượt xem, đặt chiều rộng của Chế độ xem thành 50% chiều rộng của Chế độ xem khác?


3
Phần trăm hỗ trợ cho chiều rộng hoặc chiều cao đã được thêm vào trong version 1.1ConstraintLayout. Xem "Phần trăm kích thước" trên developer.android.com/reference/android/support/constraint/ , hoặc một số câu trả lời mới hơn.
sunadorer

Câu trả lời:


225

Hiện tại bạn có thể làm điều này theo một vài cách.

Một là tạo hướng dẫn (bấm chuột phải vào vùng thiết kế, sau đó bấm thêm hướng dẫn dọc / ngang). Sau đó, bạn có thể nhấp vào "tiêu đề" của hướng dẫn để thay đổi định vị thành tỷ lệ phần trăm. Cuối cùng, bạn có thể giới hạn lượt xem theo hướng dẫn.

Một cách khác là định vị một khung nhìn bằng cách sử dụng độ lệch (phần trăm) và sau đó neo các khung nhìn khác vào khung nhìn đó.

Điều đó nói rằng, chúng tôi đã suy nghĩ về cách cung cấp kích thước dựa trên tỷ lệ phần trăm. Tôi không thể thực hiện bất kỳ lời hứa nào nhưng đó là điều chúng tôi muốn thêm vào.


1
Tôi có thể yêu cầu theo dõi không? Tôi đang cố gắng đặt ImageView có chiều rộng 60% nhưng duy trì tỷ lệ khung hình 16: 9. Tôi muốn chiều rộng được cố định, nhưng chiều cao của ImageView là động. Điều đó có khả thi với ConstraintLayout không? Tôi đang vật lộn để làm cho nó hoạt động - Tôi kết thúc với các giá trị chiều rộng / chiều cao cố định là 0 trừ khi tôi chỉ định kích thước được mã hóa cứng.
MattWilliams89

3
@ MattWilliams89 Có một tham số gọi là layout_constraintDimensionRatio, tôi đoán nó có thể hữu ích trong trường hợp của bạn, viết "16: 9" ở đó. Mặc dù vậy, tôi đã không thành công khi cố gắng xây dựng bố cục của bạn với nó, hình ảnh trở nên rất lớn
Yury Fedorov

1
@RomainGuy làm thế nào để bạn thay đổi định vị thành tỷ lệ phần trăm trên tiêu đề của hướng dẫn?. tôi đã cố gắng nhấp chuột phải vào nó và không có gì xuất hiện
Edijae Crusar

21
Đối với những người tự hỏi chính xác tiêu đề của hướng dẫn là gì, đó là vòng tròn có mũi tên lên hoặc xuống hoặc ký hiệu phần trăm. Nhấp vào đó để chuyển đổi giữa ứng dụng: layout_constraintGuide_begin, app: layout_constraintGuide_end và app: layout_constraintGuide_percent trong XML. Tôi đã gặp một sự cố nhỏ (trên phiên bản ConstraintLayout 1.0.0-alpha8 khi tôi phải nhấp vào hướng dẫn, giữ chuột và kéo vào vòng tròn để chuyển đổi những thứ này trong trình chỉnh sửa, nhưng tôi chắc chắn rằng lỗi này sẽ sớm được khắc phục .
lustig

4
Bạn cũng có thể thiết lập điều này trong XML của bố cục bằng cách sử dụngapp:layout_constraintGuide_percentage
cướp biển

215

Nó có thể hữu ích để có một tài liệu tham khảo nhanh ở đây.

Vị trí quan điểm

Sử dụng một hướng dẫn với app:layout_constraintGuide_percentnhư thế này:

<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"/>

Và sau đó bạn có thể sử dụng hướng dẫn này làm điểm neo cho các chế độ xem khác.

hoặc là

Sử dụng thiên vị với app:layout_constraintHorizontal_biasvà / hoặc app:layout_constraintVertical_biasđể sửa đổi vị trí xem khi không gian có sẵn cho phép

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

Kích thước lượt xem

Một giá trị phần trăm khác là chiều cao và / hoặc chiều rộng của các phần tử, với app:layout_constraintHeight_percentvà / hoặc app:layout_constraintWidth_percent:

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

3
Tại sao nó có chiều rộng được đặt thành 1dp?
dùng924

1
@ user924 Sẽ có ý nghĩa khi đưa ra hướng dẫn có chiều rộng là 0dp, tôi không biết tại sao các nhà phát triển thực hiện điều này lại quyết định trên 1dp. Có thể vì 0dp được coi là "kéo dài" khi sử dụng quyền số.
Amir Uval

3
@ user924: 0dpđược sử dụng trong ConstraintLayout để biểu thị kích thước động. Xem developer.android.com/reference/android/support/constraint/ từ
serv-inc

1
@ serv-inc nhưng ở đây 1dp, không phải 0dp.. đó là những gì tôi đang nói đến
user924

3
@ user924: bạn cần đặt chiều rộng. 0dpđã được bảo lưu, vì vậy 1dpcó vẻ hợp lý.
phục vụ

109

Kể từ "ConstraintLayout1.1.0-beta1", bạn có thể sử dụng phần trăm để xác định chiều rộng và chiều cao.

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

Điều này sẽ xác định chiều rộng là 40% chiều rộng của màn hình. Một sự kết hợp giữa điều này và hướng dẫn theo phần trăm cho phép bạn tạo bất kỳ bố cục dựa trên phần trăm nào bạn muốn.


6
Trong bố cục ràng buộc 1.0.2, giá trị phần trăm cho layout_constraintWidth_default không được hỗ trợ. Tôi nghĩ rằng cách đúng đắn là sử dụng Hướng dẫn.
vovahost

1
nó hoạt động với Android Studio 3.0 được xây dựng vào ngày 20 tháng 10 năm 2017
douarbou

5
Như đã nêu trong câu trả lời, điều này đã được thêm vào trong version 1.1ConstraintLayout. Việc bổ sung _default="percent"là không cần thiết nữa trên phiên bản ổn định! Xem "Phần trăm kích thước" trên developer.android.com/reference/android/support/constraint/
sunadorer

@hoford, đối với một văn bản Xem chứa, có kích thước là phải được xác định trong spđơn vị, làm thế nào có thể nhắn tin cho kích thước được tự động tỉ lệ với kích thước điểm của (đó là, bởi chính nó, được xác định tương ứng với tổng kích thước bố trí của, tức là trong 'trăm') ?
Hạnh phúc

77

Với bản phát hành mới của ConstraintLayout v1.1, giờ đây bạn có thể thực hiện các thao tác sau:

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

Điều này sẽ hạn chế nút có chiều cao 20% và 65% chiều rộng của chế độ xem chính.


1
đối với tôi chỉ hoạt động khi tôi thay đổi từ "android:" thành "app:" -> app: layout_constraintHeight_percent = "0.2"
Kirill Karmazin

Đây là điều bắt buộc đối với tôi khi tuân theo cách bố trí chất lỏng của thiết kế vật liệu. material.io/design/layout/...

@Adam, đối với Chế độ xem chứa văn bản, có kích thước được xác định theo spđơn vị, làm thế nào kích thước văn bản có thể tự động tỷ lệ với kích thước của chế độ xem (chính là, được xác định tỷ lệ thuận với tổng kích thước của bố cục, tức là theo 'phần trăm') ?
Hạnh phúc

1
@Bliss Âm thanh như thế này có thể giúp: developer.android.com/guide/topics/ui/look-and-feel/ mẹo Tôi chưa bao giờ sử dụng nó cho mình.
Adam

43

Cách sử dụng Nguyên tắc

Câu trả lời được chấp nhận là một chút không rõ ràng về cách sử dụng các nguyên tắc và "tiêu đề" là gì.

Các bước

Đầu tiên thêm một hướng dẫn.

nhập mô tả hình ảnh ở đây

Chọn Hướng dẫn hoặc di chuyển nó một chút để hiển thị các ràng buộc.

nhập mô tả hình ảnh ở đây

Sau đó nhấp vào vòng tròn ("tiêu đề") cho đến khi nó trở thành phần trăm. Sau đó, bạn có thể kéo tỷ lệ phần trăm này xuống 50% hoặc bất cứ điều gì bạn muốn.

nhập mô tả hình ảnh ở đây

Sau đó, bạn có thể giới hạn chế độ xem của mình theo Hướng dẫn để làm cho tỷ lệ phần trăm của phụ huynh (sử dụng match_constrainttrên chế độ xem).

nhập mô tả hình ảnh ở đây


'Tiêu đề' nên được nhìn thấy ở đâu? Nó không hiển thị trong quan điểm của tôi.
Marcel50506

@ Marcel50506, đảm bảo rằng cả chế độ xem Thiết kế và Kế hoạch chi tiết đang hiển thị. Điều đó sẽ cho bạn cơ hội tốt nhất để có thể nhìn thấy nó. Nếu bạn có thể thấy dòng hướng dẫn, hãy thử nhấp vào nó để chọn nó. Nếu bạn không thể nhìn thấy dòng này, thì hãy thử nhấp vào mục hướng dẫn trong menu Cây thành phần nên tắt ở phía bên trái (giả sử bạn đã thêm một hướng dẫn).
Suragch

1
Tôi không thấy vòng tròn, nhưng khi nhấp vào bên trái của hướng dẫn, tôi có thể thay đổi nó thành tỷ lệ phần trăm .. Vấn đề kết xuất tôi nghĩ. Cảm ơn bạn.
Marcel50506

Đây là câu trả lời tốt nhất vì nó đề xuất cách tiếp cận bố trí tốt hơn. Chúng tôi có thể căn chỉnh nhiều lượt xem trên hướng dẫn cơ sở thay vì chỉ thêm tỷ lệ phần trăm cho một lượt xem
Nguyễn Minh Hiển

33

Hướng dẫn là vô giá - và ứng dụng: layout_constraintGuide_percent là một người bạn tuyệt vời ... Tuy nhiên, đôi khi chúng tôi muốn tỷ lệ phần trăm mà không có hướng dẫn. Bây giờ có thể sử dụng trọng lượng :

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

Dưới đây là một ví dụ đầy đủ hơn sử dụng hướng dẫn với các trọng số bổ sung :

<?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 - Trọng lượng tương đương với tỷ lệ phần trăm (bất kỳ phần trăm nào cũng có thể được chuyển đổi về mặt toán học thành trọng lượng và ngược lại). Bằng cách kén chọn về thuật ngữ, bạn bỏ lỡ điểm của câu trả lời.
Scott Bigss

11

Với ConstraintLayout v1.1.2, thứ nguyên phải được đặt thành 0dpvà sau đó đặt layout_constraintWidth_percenthoặc layout_constraintHeight_percentcác thuộc tính thành giá trị trong khoảng từ 0 đến 1 như:

<!-- 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" />

(Bạn không cần phải thiết lập app:layout_constraintWidth_default="percent"hoặc app:layout_constraintHeight_default="percent"với ConstraintLayout 1.1.2 và các phiên bản sau)


9

Ràng buộc bố cục 1.0 tạo chế độ xem chiếm một tỷ lệ phần trăm của màn hình cần thực hiện theo hai nguyên tắc. Trong Bố cục ràng buộc 1.1, nó được thực hiện đơn giản hơn bằng cách cho phép bạn dễ dàng hạn chế bất kỳ chế độ xem nào theo chiều rộng hoặc chiều cao phần trăm.

nhập mô tả hình ảnh ở đây

Điều này thật tuyệt phải không? Tất cả các khung nhìn đều hỗ trợ các thuộc tính layout_constraintWidth_percent và layout_constraintHeight_percent. Những điều này sẽ khiến các ràng buộc được cố định theo tỷ lệ phần trăm của không gian có sẵn. Vì vậy, việc tạo Nút hoặc TextView mở rộng để lấp đầy phần trăm màn hình có thể được thực hiện bằng một vài dòng XML.

Ví dụ: nếu bạn muốn đặt độ rộng của nút thành 70% màn hình, bạn có thể làm như thế này:

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

Xin lưu ý rằng bạn sẽ phải đặt kích thước nên được sử dụng theo tỷ lệ phần trăm thành 0dp vì chúng tôi đã chỉ định android: layout_creen thành 0dp ở trên.

Tương tự, nếu bạn muốn đặt chiều cao của nút thành 20% màn hình, bạn có thể làm như thế này:

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

Xem! chúng tôi đã chỉ định android: layout_height thành 0dp lần này vì chúng tôi muốn nút sử dụng chiều cao theo tỷ lệ phần trăm.


8

Hãy thử mã này. Bạn có thể thay đổi tỷ lệ phần trăm chiều cao và chiều rộng với ứng dụng: layout_constraintHeight_percent và 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>

Học sinh lớp

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

nhập mô tả hình ảnh ở đây


7

bạn có thể sử dụng app:layout_constraintVertical_weightnó giống như layout_weighttronglinearlayout

<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>

LƯU Ý: app:layout_constraintVertical_weight( app:layout_constraintHorizontal_weight) sẽ hoạt động với android:layout_width="0dp"(android:layout_height="0dp"


5

Đối với ai đó có thể thấy hữu ích, bạn có thể sử dụng layout_constraintDimensionRatiobất kỳ chế độ xem con nào bên trong a ConstraintLayoutvà chúng tôi có thể xác định tỷ lệ Chiều cao hoặc Chiều rộng của kích thước khác (ít nhất một phải là 0dp chiều rộng hoặc chiều cao)

 <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"/>

trong trường hợp này, tỷ lệ khung hình là 16: 9, app:layout_constraintDimensionRatio="16:9" bạn có thể tìm thêm thông tin TẠI ĐÂY


3

Tôi biết đây không phải là những gì OP ban đầu yêu cầu nhưng điều này đã giúp tôi rất nhiều trong tình huống này khi tôi có một câu hỏi tương tự .. Thêm điều này cho những người muốn thay đổi kích thước cửa sổ bố cục (mà tôi sử dụng thường xuyên), thông qua mã . Thêm phần này vào onCreate của bạn trong hoạt động của câu hỏi. (Thay đổi thành 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

Đơn giản, chỉ cần thay thế, trong thẻ hướng dẫn của bạn

app:layout_constraintGuide_begin="291dp"

với

app:layout_constraintGuide_percent="0.7"

trong đó 0,7 có nghĩa là 70%.

Ngoài ra nếu bây giờ bạn cố gắng kéo hướng dẫn, giá trị được kéo sẽ hiển thị theo% tuổi.


2

Sử dụng Nguyên tắc, bạn có thể thay đổi định vị thành tỷ lệ phần trăm

<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"/>

Bạn cũng có thể sử dụng cách này

android:layout_width="0dp"
app:layout_constraintWidth_default="percent"
app:layout_constraintWidth_percent="0.4"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.