Xamarin.Forms學(xué)習(xí)歷程(三)——Layout之一

App開發(fā)最重要的莫過于界面的搭建,沒有界面萧豆,數(shù)據(jù)也沒有地方填充奸披,即使你會如何設(shè)置一個控件,但是你如果不知道怎么安放這個控件也是沒有用的涮雷,所以我們還得先學(xué)會布界面布局阵面。今天講的就是界面布局。

一洪鸭、StackLayout(棧布局)###

對于了解iOS9新特性的人來說样刷,這個很好理解,相當(dāng)于iOS里面的UIStackView览爵,你可以把它理解成一個矩形容器置鼻,強調(diào)一下是容器,不是視圖蜓竹,就相當(dāng)于是個紙箱子箕母,紙箱子里面放了一堆控件,然后各個紙箱子之間水平擺放梅肤。畫個圖理解一下


Snip20160812_38.png

畫的有點丑司蔬,除了藍色其他的都是StackLayout邑茄,如果界面復(fù)雜點就是StackLayout里套StackLayout姨蝴。StackLayout的特性就是垂直或者水平排放,就拿紅色的StackLayout來說肺缕,里面的圓角矩形和一個小長條不能用StackLayout左医,但是我們可以把兩個小長條放在一個StackLayout里面垂直排布,然后和外面的圓角矩形放在一個StackLayout里面水平排布同木,還是看圖吧浮梢。

Snip20160812_39.png

這樣應(yīng)該好理解了。重點是多寫代碼彤路,寫多了自然對它就有感覺了秕硝。說句題外話,有人說我打字慢洲尊,認為是我代碼敲得少了远豺,可是我敲了幾個項目奈偏,打字速度還是慢,因為我已經(jīng)習(xí)慣“二指禪”了躯护。
解釋了那么多惊来,直接上官方代碼

先看XML版#####
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
          xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
          x:Class="LayoutSamples.StackLayoutDemo"
          Title="StackLayout Demo">
  <ContentPage.Content>
    <StackLayout Spacing="10" x:Name="layout">
      <Button Text="StackLayout" VerticalOptions="Start"
        HorizontalOptions="FillAndExpand" />
      <BoxView Color="Yellow" VerticalOptions="FillAndExpand"
        HorizontalOptions="FillAndExpand" />
      <BoxView Color="Green" VerticalOptions="FillAndExpand"
        HorizontalOptions="FillAndExpand" />
      <BoxView HeightRequest="75" Color="Blue" VerticalOptions="End"
        HorizontalOptions="FillAndExpand" />
    </StackLayout>
    </ContentPage.Content>
</ContentPage>

我們只看StackLayout里面的東西,就是1個button棺滞、3個BoxView裁蚁,我們可以發(fā)現(xiàn)出現(xiàn)最多的是VerticalOptions和HorizontalOptions。接下來我們就說說它倆继准,他們分別是垂直約束條件和水平約束條件枉证,
重點是它有哪些:

  • Start:放置在layout起始位置
  • Center:放置在layout中間位置
  • End:放置在layout最后位置
  • Fill:放置在layout中使其沒有間距
  • StartAndExpand:放置在layout起始位置,并盡可能占據(jù)layout所能給的最大空間
  • CenterAndExpand:放置在layout中間位置移必,并盡可能占據(jù)layout所能給的最大空間
  • EndAndExpand:放置在layout最后位置刽严,并盡可能占據(jù)layout所能給的最大空間
  • FillAndExpand:放置在layout中使其沒有間距,并盡可能占據(jù)layout所能給的最大空間
再看C#版#####
public class StackLayoutCode : ContentPage
{
  public StackLayoutCode ()
  {
    var layout = new StackLayout ();
    var button = new Button { 
            VerticalOptions = LayoutOptions.Start,
             HorizontalOptions = LayoutOptions.FillAndExpand };
    var oneBox = new BoxView { 
            VerticalOptions = LayoutOptions.FillAndExpand,  
            HorizontalOptions = LayoutOptions.FillAndExpand };
    var twoBox = new BoxView { 
            VerticalOptions = LayoutOptions.FillAndExpand,
           HorizontalOptions = LayoutOptions.FillAndExpand };
    var threeBox = new BoxView { 
           VerticalOptions = LayoutOptions.FillAndExpand,
           HorizontalOptions = LayoutOptions.FillAndExpand };

    layout.Children.Add(button);
    layout.Children.Add(oneBox);
    layout.Children.Add(twoBox);
    layout.Children.Add(threeBox);
    Content = layout;
  }
}

個人認為StackLayout比較重要而且常用避凝,需要重點掌握魔眨。

二、AbsoluteLayout(絕對布局)###

這個相對比較容易,就是坐標系約束幔虏,不過他又是不完全的坐標系約束。我們先看看代碼撵儿。

XML版#####
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="LayoutSamples.AbsoluteLayoutExploration"
Title="Absolute Layout Exploration">
    <ContentPage.Content>
        <AbsoluteLayout>
            <Label Text="I'm centered on iPhone 4 but no other device"
                AbsoluteLayout.LayoutBounds="115,150,100,100" LineBreakMode="WordWrap"  />
            <Label Text="I'm bottom center on every device."
                AbsoluteLayout.LayoutBounds=".5,1,.5,.1" AbsoluteLayout.LayoutFlags="All"
                LineBreakMode="WordWrap"  />
            <BoxView Color="Olive"  AbsoluteLayout.LayoutBounds="1,.5, 25, 100"
                AbsoluteLayout.LayoutFlags="PositionProportional" />
            <BoxView Color="Red" AbsoluteLayout.LayoutBounds="0,.5,25,100"
                AbsoluteLayout.LayoutFlags="PositionProportional" />
            <BoxView Color="Blue" AbsoluteLayout.LayoutBounds=".5,0,100,25"
                AbsoluteLayout.LayoutFlags="PositionProportional" />
        </AbsoluteLayout>
    </ContentPage.Content>
</ContentPage>

不用說了饲做,AbsoluteLayout.LayoutBounds就是坐標系分別為( x, y, width, height)盆均,和iOS的坐標系約束沒什么區(qū)別泪姨,不過下面的就不同了:AbsoluteLayout.LayoutFlags肮砾,它有這些枚舉值

  • ** None:**默認值,所有值均是絕對值
  • ** All:**所有值均是等比例
  • ** WidthProportional:**寬度是等比例的袋坑,其他值是絕對值
  • ** HeightProportional:**高度是等比例的仗处,其他值是絕對值
  • ** XProportional:**X值是等比例的,其他值是絕對值
  • ** YProportional:**Y值是等比例的,其他值是絕對值
  • ** PositionProportional:**X婆誓、Y值是等比例的咒精,其他值是絕對值
  • ** SizeProportional:**高度、寬度是等比例的旷档,其他值是絕對值
    這樣一來理解的應(yīng)該差不多了模叙。
C#版
public class AbsoluteLayoutExplorationCode : ContentPage
{
    public AbsoluteLayoutExplorationCode ()
    {
        Title = "Absolute Layout Exploration - Code";
        var layout = new AbsoluteLayout();

        var centerLabel = new Label {
        Text = "I'm centered on iPhone 4 but no other device.",
        LineBreakMode = LineBreakMode.WordWrap};

        AbsoluteLayout.SetLayoutBounds (centerLabel, new Rectangle (115, 159, 100, 100));
        // No need to set layout flags, absolute positioning is the default

        var bottomLabel = new Label { Text = "I'm bottom center on every device.", LineBreakMode = LineBreakMode.WordWrap };
        AbsoluteLayout.SetLayoutBounds (bottomLabel, new Rectangle (.5, 1, .5, .1));
        AbsoluteLayout.SetLayoutFlags (bottomLabel, AbsoluteLayoutFlags.All);

        var rightBox = new BoxView{ Color = Color.Olive };
        AbsoluteLayout.SetLayoutBounds (rightBox, new Rectangle (1, .5, 25, 100));
        AbsoluteLayout.SetLayoutFlags (rightBox, AbsoluteLayoutFlags.PositionProportional);

        var leftBox = new BoxView{ Color = Color.Red };
        AbsoluteLayout.SetLayoutBounds (leftBox, new Rectangle (0, .5, 25, 100));
        AbsoluteLayout.SetLayoutFlags (leftBox, AbsoluteLayoutFlags.PositionProportional);

        var topBox = new BoxView{ Color = Color.Blue };
        AbsoluteLayout.SetLayoutBounds (topBox, new Rectangle (.5, 0, 100, 25));
        AbsoluteLayout.SetLayoutFlags (topBox, AbsoluteLayoutFlags.PositionProportional);

        layout.Children.Add (bottomLabel);
        layout.Children.Add (centerLabel);
        layout.Children.Add (rightBox);
        layout.Children.Add (leftBox);
        layout.Children.Add (topBox);

        Content = layout;
    }
}

結(jié)語###

本想一口氣全寫完的,后面還有三個鞋屈,太多了范咨,后面三個下期再與大家分享吧。下期將分享RelativeLayout(相對布局)厂庇、Grid(網(wǎng)格布局)渠啊、Scrollview(滾動布局)。本文中如有錯誤之處還望大神指正权旷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末替蛉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拄氯,更是在濱河造成了極大的恐慌躲查,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件译柏,死亡現(xiàn)場離奇詭異镣煮,居然都是意外死亡,警方通過查閱死者的電腦和手機鄙麦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門典唇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胯府,你說我怎么就攤上這事介衔。” “怎么了骂因?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵炎咖,是天一觀的道長。 經(jīng)常有香客問我侣签,道長塘装,這世上最難降的妖魔是什么急迂? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任影所,我火速辦了婚禮,結(jié)果婚禮上僚碎,老公的妹妹穿的比我還像新娘猴娩。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布卷中。 她就那樣靜靜地躺著矛双,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蟆豫。 梳的紋絲不亂的頭發(fā)上议忽,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機與錄音十减,去河邊找鬼栈幸。 笑死,一個胖子當(dāng)著我的面吹牛帮辟,可吹牛的內(nèi)容都是我干的速址。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼由驹,長吁一口氣:“原來是場噩夢啊……” “哼芍锚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蔓榄,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤并炮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后甥郑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渣触,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年壹若,在試婚紗的時候發(fā)現(xiàn)自己被綠了嗅钻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡店展,死狀恐怖养篓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赂蕴,我是刑警寧澤柳弄,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站概说,受9級特大地震影響碧注,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜糖赔,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一萍丐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧放典,春花似錦逝变、人聲如沸基茵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拱层。三九已至,卻和暖如春宴咧,著一層夾襖步出監(jiān)牢的瞬間根灯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工掺栅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留箱吕,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓柿冲,卻偏偏與公主長得像茬高,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子假抄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容