Xamarin.Forms RelativeLayout
RelativeLayout
digunakan untuk memosisikan dan mengukur anak relatif terhadap properti tata letak atau elemen saudara. Ini memungkinkan UI dibuat yang menskalakan secara proporsional di seluruh ukuran perangkat. Selain itu, tidak seperti beberapa kelas tata letak lainnya, RelativeLayout
mampu memposisikan turunan sehingga tumpang tindih.
Kelas RelativeLayout
menentukan properti berikut:
XConstraint
, dari jenisConstraint
, yang merupakan properti terlampir yang mewakili batasan pada posisi X anak.YConstraint
, dari jenisConstraint
, yang merupakan properti terlampir yang mewakili batasan pada posisi Y anak.WidthConstraint
, dari jenisConstraint
, yang merupakan properti terlampir yang mewakili batasan pada lebar anak.HeightConstraint
, dari jenisConstraint
, yang merupakan properti terlampir yang mewakili batasan pada tinggi anak.BoundsConstraint
, dari jenisBoundsConstraint
, yang merupakan properti terlampir yang mewakili batasan pada posisi dan ukuran anak. Properti ini tidak dapat dengan mudah dikonsumsi dari XAML.
Properti ini didukung oleh BindableProperty
objek, yang berarti bahwa properti dapat menjadi target pengikatan data dan ditata. Untuk informasi selengkapnya tentang properti terlampir, lihat Xamarin.Forms Properti Terlampir.
Catatan
Lebar dan tinggi anak dalam RelativeLayout
juga dapat ditentukan melalui properti dan HeightRequest
anakWidthRequest
, bukan WidthConstraint
properti dan HeightConstraint
terlampir.
Kelas RelativeLayout
berasal dari Layout<T>
kelas , yang mendefinisikan Children
properti jenis IList<T>
. Properti Children
adalah ContentProperty
kelas Layout<T>
, dan oleh karena itu tidak perlu diatur secara eksplisit dari XAML.
Tip
Hindari menggunakan RelativeLayout
jika memungkinkan. Ini akan mengakibatkan CPU harus melakukan lebih banyak pekerjaan secara signifikan.
Kendala
RelativeLayout
Dalam , posisi dan ukuran anak ditentukan sebagai batasan menggunakan nilai absolut atau nilai relatif. Ketika batasan tidak ditentukan, anak akan diposisikan di sudut kiri atas tata letak.
Tabel berikut ini memperlihatkan cara menentukan batasan di XAML dan C#:
XAML | C# | |
---|---|---|
Nilai absolut | Batasan absolut ditentukan dengan mengatur RelativeLayout properti terlampir ke double nilai. |
Batasan absolut ditentukan oleh Constraint.Constant metode , atau dengan menggunakan Children.Add kelebihan beban yang memerlukan Func<Rectangle> argumen. |
Nilai relatif | Batasan relatif ditentukan dengan mengatur RelativeLayout properti terlampir ke Constraint objek yang dikembalikan oleh ConstraintExpression ekstensi markup. |
Batasan relatif ditentukan oleh Constraint objek yang dikembalikan oleh metode Constraint kelas. |
Untuk informasi selengkapnya tentang menentukan batasan menggunakan nilai absolut, lihat Posisi dan ukuran absolut. Untuk informasi selengkapnya tentang menentukan batasan menggunakan nilai relatif, lihat Posisi dan ukuran relatif.
Di C#, anak-anak dapat ditambahkan ke RelativeLayout
tiga Add
kelebihan beban. Kelebihan beban pertama memerlukan Expression<Func<Rectangle>>
untuk menentukan posisi dan ukuran anak. Kelebihan beban kedua memerlukan objek opsional Expression<Func<double>>
untuk argumen , , y
width
, dan height
x
. Kelebihan beban ketiga memerlukan objek opsional Constraint
untuk argumen , , y
width
, dan height
x
.
Dimungkinkan untuk mengubah posisi dan ukuran anak dengan RelativeLayout
metode , , SetYConstraint
SetWidthConstraint
, dan SetHeightConstraint
.SetXConstraint
Argumen pertama untuk masing-masing metode ini adalah anak, dan yang kedua adalah Constraint
objek. Selain itu, metode ini SetBoundsConstraint
juga dapat digunakan untuk mengubah posisi dan ukuran anak. Argumen pertama untuk metode ini adalah anak, dan yang kedua adalah BoundsConstraint
objek.
Posisi dan ukuran absolut
Dapat RelativeLayout
memosisikan dan mengukur anak menggunakan nilai absolut, yang ditentukan dalam unit independen perangkat, yang secara eksplisit menentukan di mana anak-anak harus ditempatkan dalam tata letak. Ini dicapai dengan menambahkan anak-anak ke Children
koleksi dan mengatur XConstraint
properti , , YConstraint
WidthConstraint
, dan HeightConstraint
terlampir pada setiap anak ke posisi absolut dan/RelativeLayout
atau nilai ukuran.
Peringatan
Menggunakan nilai absolut untuk penempatan dan ukuran anak dapat bermasalah, karena perangkat yang berbeda memiliki ukuran dan resolusi layar yang berbeda. Oleh karena itu, koordinat untuk pusat layar pada satu perangkat mungkin diimbangi pada perangkat lain.
XAML berikut menunjukkan RelativeLayout
anak-anaknya diposisikan menggunakan nilai absolut:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="RelativeLayoutDemos.Views.StylishHeaderDemoPage"
Title="Stylish header demo">
<RelativeLayout Margin="20">
<BoxView Color="Silver"
RelativeLayout.XConstraint="0"
RelativeLayout.YConstraint="10"
RelativeLayout.WidthConstraint="200"
RelativeLayout.HeightConstraint="5" />
<BoxView Color="Silver"
RelativeLayout.XConstraint="0"
RelativeLayout.YConstraint="20"
RelativeLayout.WidthConstraint="200"
RelativeLayout.HeightConstraint="5" />
<BoxView Color="Silver"
RelativeLayout.XConstraint="10"
RelativeLayout.YConstraint="0"
RelativeLayout.WidthConstraint="5"
RelativeLayout.HeightConstraint="65" />
<BoxView Color="Silver"
RelativeLayout.XConstraint="20"
RelativeLayout.YConstraint="0"
RelativeLayout.WidthConstraint="5"
RelativeLayout.HeightConstraint="65" />
<Label Text="Stylish header"
FontSize="24"
RelativeLayout.XConstraint="30"
RelativeLayout.YConstraint="25" />
</RelativeLayout>
</ContentPage>
Dalam contoh ini, posisi setiap BoxView
objek didefinisikan menggunakan nilai yang ditentukan dalam XConstraint
properti terlampir dan YConstraint
. Ukuran masing-masing BoxView
ditentukan menggunakan nilai yang ditentukan dalam WidthConstraint
properti terlampir dan HeightConstraint
. Posisi Label
objek juga didefinisikan menggunakan nilai yang ditentukan dalam XConstraint
properti terlampir dan YConstraint
. Namun, nilai ukuran tidak ditentukan untuk Label
, sehingga tidak dibatasi dan ukuran itu sendiri. Dalam semua kasus, nilai absolut mewakili unit independen perangkat.
Cuplikan layar berikut menunjukkan tata letak yang dihasilkan:
Kode C# yang setara ditunjukkan di bawah ini:
public class StylishHeaderDemoPageCS : ContentPage
{
public StylishHeaderDemoPageCS()
{
RelativeLayout relativeLayout = new RelativeLayout
{
Margin = new Thickness(20)
};
relativeLayout.Children.Add(new BoxView
{
Color = Color.Silver
}, () => new Rectangle(0, 10, 200, 5));
relativeLayout.Children.Add(new BoxView
{
Color = Color.Silver
}, () => new Rectangle(0, 20, 200, 5));
relativeLayout.Children.Add(new BoxView
{
Color = Color.Silver
}, () => new Rectangle(10, 0, 5, 65));
relativeLayout.Children.Add(new BoxView
{
Color = Color.Silver
}, () => new Rectangle(20, 0, 5, 65));
relativeLayout.Children.Add(new Label
{
Text = "Stylish Header",
FontSize = 24
}, Constraint.Constant(30), Constraint.Constant(25));
Title = "Stylish header demo";
Content = relativeLayout;
}
}
Dalam contoh ini, BoxView
objek ditambahkan ke RelativeLayout
penggunaan Add
kelebihan beban yang memerlukan Expression<Func<Rectangle>>
untuk menentukan posisi dan ukuran setiap anak. Posisi Label
didefinisikan menggunakan Add
kelebihan beban yang memerlukan objek opsional Constraint
, dalam hal ini dibuat oleh Constraint.Constant
metode .
Catatan
RelativeLayout
Yang menggunakan nilai absolut dapat memposisikan dan mengukur anak sehingga tidak cocok dalam batas tata letak.
Posisi dan ukuran relatif
Dapat RelativeLayout
memosisikan dan mengukur anak menggunakan nilai yang relatif terhadap properti tata letak, atau elemen saudara. Ini dicapai dengan menambahkan anak-anak ke Children
koleksi dan mengatur XConstraint
properti , , YConstraint
WidthConstraint
, dan HeightConstraint
terlampir pada setiap anak ke nilai relatif menggunakan Constraint
RelativeLayout
objek.
Batasan bisa berupa konstanta, relatif terhadap induk, atau relatif terhadap saudara kandung. Jenis batasan diwakili oleh ConstraintType
enumerasi, yang menentukan anggota berikut:
RelativeToParent
, yang menunjukkan batasan yang relatif terhadap induk.RelativeToView
, yang menunjukkan batasan yang relatif terhadap tampilan (atau saudara kandung).Constant
, yang menunjukkan batasan konstanta.
Ekstensi markup batasan
Di XAML, Constraint
objek dapat dibuat oleh ConstraintExpression
ekstensi markup. Ekstensi markup ini biasanya digunakan untuk menghubungkan posisi dan ukuran anak dalam dengan RelativeLayout
induknya, atau ke saudara kandung.
Kelas ConstraintExpression
menentukan properti berikut:
Constant
, dari jenisdouble
, yang mewakili nilai konstanta batasan.ElementName
, dari jenisstring
, yang mewakili nama elemen sumber untuk menghitung batasan.Factor
, dari jenisdouble
, yang mewakili faktor untuk menskalakan dimensi yang dibatasi, relatif terhadap elemen sumber. Properti ini default ke 1.Property
, dari jenisstring
, yang mewakili nama properti pada elemen sumber yang akan digunakan dalam perhitungan batasan.Type
, dari jenisConstraintType
, yang mewakili jenis batasan.
Untuk informasi selengkapnya tentang Xamarin.Forms ekstensi markup, lihat Ekstensi Markup XAML.
XAML berikut menunjukkan RelativeLayout
anak-anaknya dibatasi oleh ConstraintExpression
ekstensi markup:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="RelativeLayoutDemos.Views.RelativePositioningAndSizingDemoPage"
Title="RelativeLayout demo">
<RelativeLayout>
<BoxView Color="Red"
RelativeLayout.XConstraint="{ConstraintExpression Type=Constant, Constant=0}"
RelativeLayout.YConstraint="{ConstraintExpression Type=Constant, Constant=0}" />
<BoxView Color="Green"
RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Constant=-40}"
RelativeLayout.YConstraint="{ConstraintExpression Type=Constant, Constant=0}" />
<BoxView Color="Blue"
RelativeLayout.XConstraint="{ConstraintExpression Type=Constant, Constant=0}"
RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Constant=-40}" />
<BoxView Color="Yellow"
RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Constant=-40}"
RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Constant=-40}" />
<!-- Centered and 1/3 width and height of parent -->
<BoxView x:Name="oneThird"
Color="Silver"
RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Factor=0.33}"
RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Factor=0.33}"
RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Factor=0.33}"
RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Factor=0.33}" />
<!-- 1/3 width and height of previous -->
<BoxView Color="Black"
RelativeLayout.XConstraint="{ConstraintExpression Type=RelativeToView, ElementName=oneThird, Property=X}"
RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToView, ElementName=oneThird, Property=Y}"
RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToView, ElementName=oneThird, Property=Width, Factor=0.33}"
RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToView, ElementName=oneThird, Property=Height, Factor=0.33}" />
</RelativeLayout>
</ContentPage>
Dalam contoh ini, posisi setiap BoxView
objek didefinisikan dengan mengatur XConstraint
properti terlampir dan YConstraint
. Properti pertama BoxView
memiliki properti yang XConstraint
terlampir dan YConstraint
diatur ke konstanta, yang merupakan nilai absolut. Objek yang tersisa BoxView
semuanya memiliki posisi yang ditetapkan dengan menggunakan setidaknya satu nilai relatif. Misalnya, objek kuning BoxView
mengatur XConstraint
properti terpasang ke lebar induknya ( RelativeLayout
) minus 40. Demikian pula, ini BoxView
mengatur YConstraint
properti terlampir ke tinggi induknya minus 40. Ini memastikan bahwa kuning BoxView
muncul di sudut kanan bawah layar.
Catatan
BoxView
objek yang tidak menentukan ukuran secara otomatis berukuran 40x40 dengan Xamarin.Forms.
Perak BoxView
bernama oneThird
diposisikan secara terpusat, relatif terhadap induknya. Ukurannya juga relatif terhadap induknya, menjadi sepertiga dari lebar dan tingginya. Ini dicapai dengan mengatur XConstraint
properti yang terpasang dan WidthConstraint
ke lebar induk ( RelativeLayout
), dikalikan dengan 0,33. Demikian pula, YConstraint
properti yang terpasang dan HeightConstraint
diatur ke tinggi induk, dikalikan dengan 0,33.
BoxView
Hitam diposisikan dan berukuran relatif terhadap oneThird
BoxView
. Ini dicapai dengan mengatur XConstraint
properti dan YConstraint
terlampir ke X
nilai dan Y
, masing-masing, dari elemen saudara. Demikian pula, ukurannya diatur ke sepertiga dari lebar dan tinggi elemen saudaranya. Ini dicapai dengan mengatur propertinya WidthConstraint
dan HeightConstraint
terlampir ke Width
nilai dan Height
elemen saudara, masing-masing, yang kemudian dikalikan dengan 0,33.
Cuplikan layar berikut menunjukkan tata letak yang dihasilkan:
Objek batasan
Kelas Constraint
mendefinisikan metode statis publik berikut, yang mengembalikan Constraint
objek:
Constant
, yang membatasi anak ke ukuran yang ditentukan dengandouble
.FromExpression
, yang membatasi anak menggunakan ekspresi lambda.RelativeToParent
, yang membatasi anak relatif terhadap ukuran induknya.RelativeToView
, yang membatasi anak relatif terhadap ukuran tampilan.
Selain itu, BoundsConstraint
kelas mendefinisikan satu metode, FromExpression
, yang mengembalikan BoundsConstraint
yang membatasi posisi dan ukuran anak dengan Expression<Func<Rectangle>>
. Metode ini dapat digunakan untuk mengatur BoundsConstraint
properti terlampir.
Kode C# berikut menunjukkan RelativeLayout
anak-anaknya dibatasi oleh Constraint
objek:
public class RelativePositioningAndSizingDemoPageCS : ContentPage
{
public RelativePositioningAndSizingDemoPageCS()
{
RelativeLayout relativeLayout = new RelativeLayout();
// Four BoxView's
relativeLayout.Children.Add(
new BoxView { Color = Color.Red },
Constraint.Constant(0),
Constraint.Constant(0));
relativeLayout.Children.Add(
new BoxView { Color = Color.Green },
Constraint.RelativeToParent((parent) =>
{
return parent.Width - 40;
}), Constraint.Constant(0));
relativeLayout.Children.Add(
new BoxView { Color = Color.Blue },
Constraint.Constant(0),
Constraint.RelativeToParent((parent) =>
{
return parent.Height - 40;
}));
relativeLayout.Children.Add(
new BoxView { Color = Color.Yellow },
Constraint.RelativeToParent((parent) =>
{
return parent.Width - 40;
}),
Constraint.RelativeToParent((parent) =>
{
return parent.Height - 40;
}));
// Centered and 1/3 width and height of parent
BoxView silverBoxView = new BoxView { Color = Color.Silver };
relativeLayout.Children.Add(
silverBoxView,
Constraint.RelativeToParent((parent) =>
{
return parent.Width * 0.33;
}),
Constraint.RelativeToParent((parent) =>
{
return parent.Height * 0.33;
}),
Constraint.RelativeToParent((parent) =>
{
return parent.Width * 0.33;
}),
Constraint.RelativeToParent((parent) =>
{
return parent.Height * 0.33;
}));
// 1/3 width and height of previous
relativeLayout.Children.Add(
new BoxView { Color = Color.Black },
Constraint.RelativeToView(silverBoxView, (parent, sibling) =>
{
return sibling.X;
}),
Constraint.RelativeToView(silverBoxView, (parent, sibling) =>
{
return sibling.Y;
}),
Constraint.RelativeToView(silverBoxView, (parent, sibling) =>
{
return sibling.Width * 0.33;
}),
Constraint.RelativeToView(silverBoxView, (parent, sibling) =>
{
return sibling.Height * 0.33;
}));
Title = "RelativeLayout demo";
Content = relativeLayout;
}
}
Dalam contoh ini, anak ditambahkan ke RelativeLayout
penggunaan kelebihan beban yang memerlukan objek opsional Constraint
untuk x
argumen , , y
width
, dan height
Add
.
Catatan
RelativeLayout
Yang menggunakan nilai relatif dapat memposisikan dan mengukur anak sehingga tidak cocok dalam batas tata letak.