官术网_书友最值得收藏!

3.1 其他布局

本節(jié)介紹Android另外兩個(gè)常用的布局視圖,分別是相對(duì)布局RelativeLayout的屬性說明與注意點(diǎn)、框架布局FrameLayout的屬性說明與注意點(diǎn)。

3.1.1 相對(duì)布局RelativeLayout

RelativeLayout下級(jí)視圖的位置是相對(duì)位置,得有具體的參照物才能確定最終位置。如果不設(shè)定下級(jí)視圖的參照物,那么下級(jí)視圖默認(rèn)顯示在RelativeLayout內(nèi)部的左上角。用于確定視圖位置的參照物分兩種,一種是與該視圖自身平級(jí)的視圖,另一種是該視圖的上級(jí)視圖(RelativeLayout)。與參照物對(duì)比,相對(duì)位置的屬性與類型值見表3-1。

表3-1 相對(duì)位置的屬性與類型的取值說明

為了更好地理解上述相對(duì)屬性的含義,接下來使用RelativeLayout及其下級(jí)視圖進(jìn)行布局,看看實(shí)際效果圖是怎樣的。下面是演示相對(duì)布局的XML代碼:

        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="500dp" >
            <Button
              android:id="@+id/btn_center"
              style="@style/btn_relative"
              android:layout_centerInParent="true"
              android:text="我在中間"/>
          <Button
              android:id="@+id/btn_center_horizontal"
              style="@style/btn_relative"
              android:layout_centerHorizontal="true"
              android:text="我在水平中間"/>
          <Button
              android:id="@+id/btn_center_vertical"
              style="@style/btn_relative"
              android:layout_centerVertical="true"
              android:text="我在垂直中間"/>
          <Button
              android:id="@+id/btn_parent_left"
              style="@style/btn_relative"
              android:layout_marginTop="100dp"
              android:layout_alignParentLeft="true"
              android:text="我跟上級(jí)左邊對(duì)齊"/>
          <Button
              android:id="@+id/btn_parent_top"
              style="@style/btn_relative"
              android:layout_width="120dp"
              android:layout_alignParentTop="true"
              android:text="我跟上級(jí)頂部對(duì)齊"/>
          <Button
              android:id="@+id/btn_parent_right"
              style="@style/btn_relative"
              android:layout_marginTop="100dp"
              android:layout_alignParentRight="true"
              android:text="我跟上級(jí)右邊對(duì)齊"/>
          <Button
              android:id="@+id/btn_parent_bottom"
              style="@style/btn_relative"
              android:layout_width="120dp"
              android:layout_alignParentBottom="true"
              android:layout_centerHorizontal="true"
              android:text="我跟上級(jí)底部對(duì)齊"/>
          <Button
              android:id="@+id/btn_left_bottom"
              style="@style/btn_relative"
              android:layout_toLeftOf="@+id/btn_parent_bottom"
              android:layout_alignTop="@+id/btn_parent_bottom"
              android:text="我在底部左邊"/>
            <Button
                android:id="@+id/btn_right_bottom"
                style="@style/btn_relative"
                android:layout_toRightOf="@+id/btn_parent_bottom"
                android:layout_alignBottom="@+id/btn_parent_bottom"
                android:text="我在底部右邊"/>
            <Button
                android:id="@+id/btn_above_center"
                style="@style/btn_relative"
                android:layout_above="@+id/btn_center"
                android:layout_alignLeft="@+id/btn_center"
                android:text="我在中間上面"/>
            <Button
                android:id="@+id/btn_below_center"
                style="@style/btn_relative"
                android:layout_below="@+id/btn_center"
                android:layout_alignRight="@+id/btn_center"
                android:text="我在中間下面"/>
        </RelativeLayout>

上述布局文件的效果如圖3-1所示,RelativeLayout的下級(jí)視圖為各個(gè)按鈕控件,按鈕上的文字說明了所處的相對(duì)位置,具體的控件顯示方位正如XML屬性中描述的那樣。

圖3-1 在布局文件中定義的相對(duì)布局

一般我們?cè)诓季治募芯投x好了視圖的相對(duì)位置,很少會(huì)等到在代碼中定義。不過也有特殊情況,如果視圖是在代碼中動(dòng)態(tài)添加的,那么相對(duì)位置也只能在代碼中臨時(shí)定義。代碼中定義相對(duì)位置用到的是RelativeLayout.LayoutParams的addRule方法,該方法的第一個(gè)參數(shù)表示相對(duì)位置的類型,具體取值說明見表3-1;第二個(gè)參數(shù)表示參照物視圖的ID,即當(dāng)前視圖要參照哪個(gè)視圖確定自身位置。

下面是在代碼中給RelativeLayout動(dòng)態(tài)添加子視圖并指定子視圖相對(duì)位置的代碼片段:

            public void onClick(View v) {
                if (v.getId() == R.id.btn_add_left) {
                    addNewView(RelativeLayout.LEFT_OF, RelativeLayout.ALIGN_TOP, v.getId());
                } else if (v.getId() == R.id.btn_add_above) {
                    addNewView(RelativeLayout.ABOVE, RelativeLayout.ALIGN_LEFT, v.getId());
                } else if (v.getId() == R.id.btn_add_right) {
                    addNewView(RelativeLayout.RIGHT_OF, RelativeLayout.ALIGN_BOTTOM, v.getId());
                } else if (v.getId() == R.id.btn_add_below) {
                    addNewView(RelativeLayout.BELOW, RelativeLayout.ALIGN_RIGHT, v.getId());
                } else if (v.getId() == R.id.btn_add_center) {
                    addNewView(RelativeLayout.CENTER_IN_PARENT, -1, rl_content.getId());
                } else if (v.getId() == R.id.btn_add_parent_left) {
                    addNewView(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.CENTER_VERTICAL, rl_content.getId());
                } else if (v.getId() == R.id.btn_add_parent_top) {
                    addNewView(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.CENTER_HORIZONTAL, rl_content.getId());
                } else if (v.getId() == R.id.btn_add_parent_right) {
                    addNewView(RelativeLayout.ALIGN_PARENT_RIGHT, -1, rl_content.getId());
                } else if (v.getId() == R.id.btn_add_parent_bottom) {
                    addNewView(RelativeLayout.ALIGN_PARENT_BOTTOM, -1, rl_content.getId());
                }
            }


            private void addNewView(int firstAlign, int secondAlign, int referId) {
                View v = new View(this);
                v.setBackgroundColor(0xaa66ff66);
                RelativeLayout.LayoutParams rl_params = new RelativeLayout.LayoutParams(100, 100);
                rl_params.addRule(firstAlign, referId);
                if (secondAlign >= 0) {
                    rl_params.addRule(secondAlign, referId);
                }
                v.setLayoutParams(rl_params);
                v.setOnLongClickListener(new OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View vv) {
                        rl_content.removeView(vv);
                        return true;
                    }
                });
                rl_content.addView(v);
            }

動(dòng)態(tài)添加子控件的效果如圖3-2所示,在圖上給每個(gè)方塊子視圖做了編號(hào),以此區(qū)分該方塊是由哪個(gè)按鈕添加的以及添加的相對(duì)位置。

圖3-2 在代碼中動(dòng)態(tài)添加下級(jí)視圖的相對(duì)布局

3.1.2 框架布局FrameLayout

FrameLayout也是較常用的布局,其下級(jí)視圖無法指定所處的位置,只能統(tǒng)統(tǒng)從上級(jí)FrameLayout的左上角開始添加,并且后面添加的子視圖會(huì)把之前的子視圖覆蓋掉??蚣懿季忠话阌糜谛枰丿B顯示的場合,比如繪圖、游戲界面等,常見屬性說明如下。

● foreground:指定框架布局的前景圖像。該圖像在框架內(nèi)部永遠(yuǎn)處于最頂層,不會(huì)被框架內(nèi)的其他視圖覆蓋。

● foregroundGravity:指定前景圖像的對(duì)齊方式。該屬性的取值說明同gravity。

為了更直觀地理解FrameLayout,我們可在代碼中為框架布局動(dòng)態(tài)添加子視圖,然后觀察前后兩個(gè)子視圖的顯示效果。

先給框架布局添加一個(gè)暗灰色的子視圖,如圖3-3所示。再給框架布局添加一個(gè)鮮紅色子視圖,如圖3-4所示。此時(shí)后面添加的視圖會(huì)覆蓋前面添加的視圖。注意,框架視圖上方正中間的小圖標(biāo)一直都沒被覆蓋,是它被指定為前景圖像的緣故。

圖3-3 在框架布局中添加第一個(gè)子視圖

圖3-4 在框架布局中添加第二個(gè)子視圖

除了線性布局、相對(duì)布局、框架布局外,Android還提供了其他幾個(gè)布局視圖,如絕對(duì)布局AbsoluteLayout、表格布局TableLayout等,不過這幾個(gè)布局在實(shí)際開發(fā)中用得并不多,讀者只需掌握前3種布局就可以了。

主站蜘蛛池模板: 从化市| 上栗县| 珠海市| 潼南县| 黄冈市| 大同县| 乐至县| 河北省| 铜陵市| 慈利县| 湟源县| 涡阳县| 拜泉县| 泽库县| 寿宁县| 子长县| 张家港市| 阿合奇县| 莆田市| 乐山市| 宽城| 乐平市| 五指山市| 巴马| 鄂伦春自治旗| 鄂伦春自治旗| 大冶市| 青河县| 临漳县| 梨树县| 游戏| 湾仔区| 大足县| 利辛县| 抚宁县| 乐亭县| 舟曲县| 那曲县| 平昌县| 柳河县| 嵩明县|