ConstraintLayout'un yüzde değerleriyle çalışmasını nasıl sağlayabilirim?


207

Android Studio 2.2 bir Önizleme 1 ile Google'ın destek kütüphanesinde yeni bir düzen yayınlandı: ConstraintLayout. ConstraintLayout ile Android Studio'da bir Tasarım aracı kullanmak daha kolaydır, ancak göreli boyutları (LinearLayout'ta olduğu gibi yüzdeler veya 'ağırlıklar') kullanmanın bir yolunu bulamadım. Kısıtlamaları yüzdelere göre tanımlamanın bir yolu var mı? Örneğin, bir Görüntünün bir ekranın% 40'ını almasını, görünümler arasında% 20'lik bir kenar boşluğu oluşturmasını, bir Görünümün genişliğini başka bir Görünümün genişliğinin% 50'sine ayarlamak mı?


3
Genişlik veya yükseklik için yüzde desteği version 1.1ConstraintLayout'ta eklendi . Developer.android.com/reference/android/support/constraint/… veya daha yeni yanıtların bazılarında "Yüzde boyutu" konusuna bakın .
sunadorer

Yanıtlar:


225

Şu anda bunu birkaç şekilde yapabilirsiniz.

Bunlardan biri yönergeler oluşturmaktır (tasarım alanını sağ tıklayın, ardından dikey / yatay kılavuz ekle'yi tıklayın). Ardından, konumlandırmayı yüzdeye dayalı olarak değiştirmek için kılavuzun "başlığını" tıklayabilirsiniz. Son olarak, görünümleri yönergelere sınırlayabilirsiniz.

Başka bir yol, önyargı (yüzde) kullanarak bir görünümü konumlandırmak ve daha sonra diğer görünümleri bu görünüme tutturmaktır.

Bununla birlikte, yüzdeye dayalı boyutların nasıl sunulacağını düşünüyoruz. Söz veremem ama eklemek istediğimiz bir şey.


1
0 aşağı oy Takip edebilir miyim? ImageView% 60 genişlik olarak ayarlamaya çalışıyorum ama 16: 9 en boy oranını korumak. Genişlik sabit olmak istiyorum, ancak ImageView yüksekliği dinamik olması. ConstraintLayout ile bu mümkün mü? Çalışmak için mücadele ediyorum - sabit kodlu boyutları belirtmedikçe 0 sabit genişlik / yükseklik değerleri ile sonuçlanır.
MattWilliams89

3
@ MattWilliams89 layout_constraintDimensionRatio adlı bir parametre var, sanırım sizin durumunuzda yararlı olabilir, "16: 9" yazın. Bununla birlikte düzeninizi oluşturmaya çalışmayı başaramadım, görüntü çok büyük
Yury Fedorov

1
@RomainGuy, konumlandırmayı kılavuz çizgilerin başlığında yüzde olarak nasıl değiştirirsiniz? sağ tıklamaya çalıştım ve hiçbir şey
görünmüyor

21
Kılavuzun başlığının tam olarak ne olduğunu merak edenler için, yukarı veya aşağı ok veya yüzde sembolü olan daire. Bu tıklandığında XML'de app: layout_constraintGuide_begin, app: layout_constraintGuide_end ve app: layout_constraintGuide_percent arasında geçiş yapar. Küçük bir sorunla karşılaştı (ConstraintLayout sürüm 1.0.0-alpha8'de, kılavuzu tıklatmak, faremi basılı tutmak ve editörde bunları değiştirmek için daireye sürüklemek zorunda kaldım, ancak bu hatanın yakında düzeltileceğinden eminim) .
lustig

4
Bunu kullanarak düzenin app:layout_constraintGuide_percentage
XML'sinde

215

Burada hızlı bir referans olması faydalı olabilir.

Görünümlerin yerleştirilmesi

Bir kullan kılavuz ile app:layout_constraintGuide_percentböyle:

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

Ve sonra bu kılavuzu diğer görünümler için bağlantı noktaları olarak kullanabilirsiniz.

veya

Kullanılabilir alan izin verdiğinde görünüm konumunu değiştirmek için ve / veya ile sapma kullanınapp:layout_constraintHorizontal_biasapp:layout_constraintVertical_bias

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

Görüntüleme boyutu

Başka bir yüzde olarak değer yüksekliği ve / veya elemanların genişliği ile app:layout_constraintHeight_percentve / veya app:layout_constraintWidth_percent:

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

3
neden genişliği 1dp olarak ayarlanmış?
user924

1
@ user924 0dp genişliğinde bir kılavuz vermek mantıklı olurdu, bunu uygulayan geliştiricilerin neden 1dp'de karar verdiğini bilmiyorum. Belki 0dp ağırlıkları kullanırken "streç" olarak kabul edilir.
Amir Uval

3
@ user924: 0dpConstraintLayout'ta dinamik boyutlandırmayı belirtmek için kullanılır. Bkz. Developer.android.com/reference/android/support/constraint/…
serv-inc

1
@ serv-inc ama burada 1dp, değil 0dp.. bu benim bahsettiğim şey
user924

3
@ user924: bir genişliğe ayarlamanız gerekir. 0dpzaten ayrılmış, bu yüzden 1dpmantıklı görünüyor.
serv-inc

109

"ConstraintLayout1.1.0-beta1" itibariyle, genişlikleri ve yükseklikleri tanımlamak için yüzde değerini kullanabilirsiniz.

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

Bu, genişliği ekran genişliğinin% 40'ı olarak tanımlayacaktır. Bunun ve yüzde cinsinden yönergelerin birleşimi, istediğiniz yüzde tabanlı düzeni oluşturmanıza olanak tanır.


6
Sınırlama düzeni 1.0.2'de layout_constraintWidth_default için yüzde değeri desteklenmez. Bence doğru yol Rehber'i kullanmaktır.
vovahost

1
20 Ekim 2017'de oluşturulmuş Android Studio 3.0 ile çalışıyor
douarbou

5
Yanıtta belirtildiği gibi, bu version 1.1ConstraintLayout'a eklendi . _default="percent"Kararlı sürümde artık ek gerekli değildir! Bkz "Yüzde boyut" üzerinde developer.android.com/reference/android/support/constraint/...
sunadorer

@hoford, boyutu spbirim olarak tanımlanacak metin içeren bir Görünüm için metin boyutu görünümün boyutuyla nasıl otomatik orantılı olabilir (tek başına, mizanpajın toplam boyutuyla orantılı olarak tanımlanır, yani 'yüzde' olarak) ?
Mutluluk

77

ConstraintLayout v1.1'in yeni sürümü ile artık aşağıdakileri yapabilirsiniz:

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

Bu, düğmeyi üst görünümün yüksekliğinin% 20'si ve genişliğinin% 65'i olarak sınırlar.


1
benim için sadece "android:" yerine "app:" -> app: layout_constraintHeight_percent = "0.2" değiştirdiğimde çalıştı
Kirill Karmazin

Malzeme tasarımının akışkan düzenini takip ederken bu benim için bir zorunluluktur. material.io/design/layout/…

@Adam, boyutu spbirim olarak tanımlanacak olan metin içeren bir Görünüm için , metin boyutu görünümün boyutuyla nasıl otomatik orantılı olabilir (kendi başına, mizanpajın toplam boyutuyla orantılı olarak tanımlanır, yani 'yüzde' olarak) ?
Mutluluk

1
@Bliss Bunun gibi geliyor yardımcı olabilir: developer.android.com/guide/topics/ui/look-and-feel/… Ben hiç kullanmadım.
Adam

43

Kullanım Talimatları

Kabul edilen cevap, kılavuzların nasıl kullanılacağı ve "üstbilginin" ne olduğu konusunda biraz belirsizdir.

adımlar

İlk önce bir Kılavuz ekleyin.

resim açıklamasını buraya girin

Kısıtlamaları görünür hale getirmek için Kılavuz Çizgisini seçin veya biraz hareket ettirin.

resim açıklamasını buraya girin

Ardından yüzde olana kadar yuvarlak daireyi ("başlık") tıklayın. Daha sonra bu yüzdeyi% 50'ye veya istediğiniz herhangi bir şeye sürükleyebilirsiniz.

resim açıklamasını buraya girin

Bundan sonra, ebeveynin bir yüzdesini yapmak için ( match_constraintgörünümde kullanarak ) görünümünüzü Kılavuzla sınırlayabilirsiniz .

resim açıklamasını buraya girin


'Başlık' nerede görünmelidir? Benim görüşüme göre görünmüyor.
Marcel50506

@ Marcel50506, hem Tasarım hem de Blueprint görünümlerinin gösterildiğinden emin olun. Bu, onu görebilmeniz için size en iyi şansı verecektir. Kılavuz çizgisini görebiliyorsanız, seçmek için üzerine tıklamayı deneyin. Çizgiyi göremiyorsanız, Bileşen Ağacı menüsünde sol tarafa kapalı olması gereken (zaten bir kılavuz eklediğiniz varsayılarak) kılavuz öğesini tıklamayı deneyin.
Suragch

1
Çemberi görmüyorum, ama kılavuzun soluna tıkladığınızda yüzdelerde değiştirebilirim. Teşekkür ederim.
Marcel50506

Bu en iyi yanıttır çünkü daha iyi düzen yaklaşımı önermektedir. Yalnızca tek bir görünüme yüzde eklemek yerine temel yönerge üzerinde birden çok görünümü hizalayabiliriz
Nguyen Minh Hien 27:09

33

Kılavuz çok değerlidir - ve uygulama: layout_constraintGuide_percent harika bir arkadaştır ... Ancak bazen yönergeler olmadan yüzdeler istiyoruz. Şimdi ağırlık kullanmak mümkün :

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

Aşağıda, ek ağırlıklara sahip bir kılavuz kullanan daha eksiksiz bir örnek verilmiştir :

<?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 - Ağırlıklar yüzdelere eşdeğerdir (herhangi bir yüzde matematiksel olarak bir ağırlığa dönüştürülebilir veya tam tersi). Terminolojide nit seçici davranarak cevabın noktasını kaçırırsınız.
Scott Biggs

11

ConstraintLayout v1.1.2 ile, boyut şu şekilde ayarlanmalı 0dpve daha sonra layout_constraintWidth_percentveya layout_constraintHeight_percentöznitelikleri 0 ile 1 arasında bir değere ayarlanmalıdır :

<!-- 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 ve sonraki sürümlerini ayarlamanıza app:layout_constraintWidth_default="percent"veya app:layout_constraintHeight_default="percent"yüklemenize gerek yoktur )


10

Görünüm yapmak için Kısıt Düzeni 1.0, iki yönerge yapılması gereken ekranın bir yüzdesini alır. Kısıt Düzeni 1.1'de, herhangi bir görünümü yüzde genişlik veya yüksekliğe kolayca kısıtlamanıza izin vererek daha basit hale getirilmiştir.

resim açıklamasını buraya girin

Harika değil mi? Tüm görünümler layout_constraintWidth_percent ve layout_constraintHeight_percent özelliklerini destekler. Bunlar, kısıtlamanın kullanılabilir alanın belirli bir yüzdesine sabitlenmesine neden olur. Dolayısıyla, bir Button veya TextView ekranının yüzdesini dolduracak şekilde genişletmek birkaç XML satırı ile yapılabilir.

Örneğin, düğmenin genişliğini ekranın% 70'ine ayarlamak istiyorsanız, bunu şu şekilde yapabilirsiniz:

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

Yukarıdaki android: layout_width to 0dp olarak belirttiğimiz gibi boyutun 0dp'ye yüzde olarak kullanılması gerektiğini lütfen unutmayın.

Benzer şekilde, düğmenin yüksekliğini ekranın% 20'sine ayarlamak istiyorsanız, bunu şu şekilde yapabilirsiniz:

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

Görmek! düğmenin yüksekliği yüzde olarak kullanmasını istediğimiz için bu kez android: layout_height değerini 0dp olarak belirledik.


8

Bu kodu deneyin. Yükseklik ve genişlik yüzdelerini app: layout_constraintHeight_percent ve app: layout_constraintWidth_percent ile değiştirebilirsiniz.

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

Gradle:

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

resim açıklamasını buraya girin


7

Eğer kullanabilirsiniz app:layout_constraintVertical_weightaynı şekilde layout_weightiçindelinearlayout

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

NOT: app:layout_constraintVertical_weight( app:layout_constraintHorizontal_weight), android:layout_width="0dp"(android:layout_height="0dp"


5

Yararlı bulabilecek biri için, layout_constraintDimensionRatioa içindeki herhangi bir alt görünümü kullanabilirsiniz ConstraintLayoutve diğer boyutun Yükseklik veya Genişlik oranını tanımlayabiliriz (en az biri genişlik veya yükseklik 0dp olmalıdır)

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

bu durumda en boy oranı 16: 9 BURADAapp:layout_constraintDimensionRatio="16:9" daha fazla bilgi bulabilirsiniz


3

OP'nin aslında ne istediğini doğrudan bilmiyorum ama benzer bir sorum olduğunda bu durumda bana çok yardımcı oldu .. Düzen penceresini (düzenli olarak kullandığım) değiştirmek isteyen insanlar için bu kodu ekleyerek . Bunu soru etkinliğinde onCreate'inize ekleyin. (% 80 olarak değiştirir)

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

Yalnızca, kılavuz etiketinizde değiştirin

app:layout_constraintGuide_begin="291dp"

ile

app:layout_constraintGuide_percent="0.7"

burada 0.7% 70 anlamına gelir.

Ayrıca şimdi yönergeleri sürüklemeye çalışırsanız sürüklenen değer artık% age olarak görünecektir.


2

Yönergeleri kullanarak konumlandırmayı yüzdeye göre değiştirebilirsiniz

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

Bu şekilde de kullanabilirsiniz

android:layout_width="0dp"
app:layout_constraintWidth_default="percent"
app:layout_constraintWidth_percent="0.4"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.