Android中的每一個(gè)Activity都是有或多或少的view組成的,如果view沒有層級(jí)和歸屬,每個(gè)view相互獨(dú)立。那么管理起來就會(huì)很麻煩,于是有了view層級(jí)的概念,也就是子布局,父容器。
10余年的建湖網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都營銷網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整建湖建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“建湖網(wǎng)站設(shè)計(jì)”,“建湖網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
!--人數(shù)顯示和刷新按鈕--
include layout="@layout/anfrag_title" /
!--時(shí)間選擇器--
include layout="@layout/anfrag_time_selector" /
!--所有新增用戶圖表顯示--
include layout="@layout/new_total_user_item" /
!--新增付費(fèi)用戶圖表顯示--
include layout="@layout/new_vip_user_item" /
!--新增免費(fèi)用戶圖表顯示--
include layout="@layout/new_free_user_item" /
!--新增用戶平臺(tái)付費(fèi)率圖表顯示--
include layout="@layout/new_pay_percent_item" /
/LinearLayout
如上所述,LinearLayout就是相對的include的layout的父容器。
1 .FrameLayout簡介
設(shè)計(jì)FrameLayout是為了顯示單一項(xiàng)widget。通常,不建議使用FrameLayout顯示多項(xiàng)內(nèi)容;因?yàn)樗鼈兊牟季趾茈y調(diào)節(jié)。不用layout_gravity屬性的話,多項(xiàng)內(nèi)容會(huì)重疊;使用layout_gravity的話,能設(shè)置不同的位置。layout_gravity可以使用如下取值:
top :將對象放在其容器的頂部,不改變其大小.
bottom:將對象放在其容器的底部,不改變其大小.
left:將對象放在其容器的左側(cè),不改變其大小.
right:將對象放在其容器的右側(cè),不改變其大小.
center_vertical:將對象縱向居中,不改變其大小.
垂直對齊方式:垂直方向上居中對齊。
fill_vertical:必要的時(shí)候增加對象的縱向大小,以完全充滿其容器.?
垂直方向填充
center_horizontal:將對象橫向居中,不改變其大小.?
水平對齊方式:水平方向上居中對齊
fill_horizontal:必要的時(shí)候增加對象的橫向大小,以完全充滿其容器.?
水平方向填充:center
將對象橫縱居中,不改變其大小.
fill:必要的時(shí)候增加對象的橫縱向大小,以完全充滿其容器.
clip_vertical:附加選項(xiàng),用于按照容器的邊來剪切對象的頂部和/或底部的內(nèi)容. 剪切基于其縱向?qū)R設(shè)置:頂部對齊時(shí),剪切底部;底部對齊時(shí)剪切頂部;除此之外剪切頂部和底部.
垂直方向裁剪
clip_horizontal
附加選項(xiàng),用于按照容器的邊來剪切對象的左側(cè)和/或右側(cè)的內(nèi)容. 剪切基于其橫向?qū)R設(shè)置:左側(cè)對齊時(shí),剪切右側(cè);右側(cè)對齊時(shí)剪切左側(cè);除此之外剪切左側(cè)和右側(cè).
水平方向裁剪
注意:?區(qū)分“android:gravity”和“android:layout_gravity”。
android:gravity ? :是對控件本身來說的,是用來設(shè)置“控件自身的內(nèi)容”應(yīng)該顯示在“控件自身體積”的什么位置,默認(rèn)值是左側(cè)。
android:layout_gravity :是相對于控件的父元素來說的,設(shè)置該控件在它的父元素的什么位置
2. FrameLayout示例
創(chuàng)建一個(gè)activity,包含2組FrameLayout:1組設(shè)置android:layout_gravity屬性,另1組不設(shè)置android:layout_gravity屬性。
layout文件
?xml version="1.0" encoding="utf-8"?
LinearLayout xmlns:android=""
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
!-- 示例1 FrameLayout內(nèi)容重疊 --
TextView
? ? android:text="示例1, FrameLayout內(nèi)容重疊"
? ? android:layout_width="wrap_content"
? ? android:layout_height="wrap_content"
? ? /
FrameLayout
? ? android:layout_width="300dp"
? ? android:layout_height="80dp"
? ? TextView
? ? ? ? android:layout_width="wrap_content"
? ? ? ? android:layout_height="wrap_content"
? ? ? ? android:text="我是TextView,內(nèi)容比較長"
? ? ? ? android:background="#ff0000"/
? ? Button
? ? ? ? android:layout_width="wrap_content"
? ? ? ? android:layout_height="wrap_content"
? ? ? ? android:background="#ffff00"
? ? ? ? android:text="我是按鈕"/
/FrameLayout
!-- 示例2 FrameLayout使用layout_gravity屬性 --
TextView
? ? android:text="示例2, 設(shè)置layout_gravity"
? ? android:layout_width="wrap_content"
? ? android:layout_height="wrap_content"
? ? /
FrameLayout
? ? android:layout_width="300dp"
? ? android:layout_height="120dp"
? ? TextView
? ? ? ? android:layout_width="wrap_content"
? ? ? ? android:layout_height="wrap_content"
? ? ? ? android:text="文本居左"
? ? ? ? android:background="#ff0000"
? ? ? ? android:gravity="center"
? ? ? ? android:layout_gravity="left"
? ? ? ? android:layout_margin="10dp"/
? ? TextView
? ? ? ? android:layout_width="wrap_content"
? ? ? ? android:layout_height="wrap_content"
? ? ? ? android:text="文本居中"
? ? ? ? android:background="#ffff00"
? ? ? ? android:gravity="center"
? ? ? ? android:layout_gravity="center"/
/FrameLayout
/LinearLayout
安卓是谷歌將它從開源linux上改造而來,依舊保持開源特性。為了應(yīng)用開發(fā)者更多地開發(fā)安卓程序,自然也就保留了linux上的虛擬機(jī)機(jī)制。同時(shí),安卓的目標(biāo)是手機(jī)等移動(dòng)終端,這些設(shè)備的處理器五花百門,而且開源安卓也會(huì)被各種深入定制,這同樣導(dǎo)致了安卓依然沿用了虛擬機(jī)機(jī)制來保持高兼容性。當(dāng)然,這些華為研發(fā)了方舟編譯器,讓系統(tǒng)直接運(yùn)行機(jī)器碼,以此來消除虛擬機(jī)帶來的弊端。
1、安卓的誕生過程決定了它會(huì)沿用linux的虛擬機(jī)
安卓系統(tǒng)最早并不是谷歌研發(fā)出來的,而是一家名叫Android的初創(chuàng)公司研發(fā)的。這家公司成立22個(gè)月后,就把原始Android雛形系統(tǒng)以4千萬美元的價(jià)格賣給了谷歌。 這個(gè)雛形原本就基于linux系統(tǒng)研發(fā)而來,自然里面也還是沿用了linux的虛擬機(jī)機(jī)制。
2、移動(dòng)終端硬件廠商太多,也只能沿用虛擬機(jī)方式
谷歌拿到系統(tǒng)后,自己繼續(xù)研發(fā)Android系統(tǒng),在2007年還集合了84家當(dāng)時(shí)一流的硬件廠商組成研發(fā)聯(lián)盟。整個(gè)研發(fā)依然還是基于linux開源系統(tǒng),但它解決了商業(yè)化的一個(gè)大難題。那就是,linux是開源系統(tǒng),是有GPL開源協(xié)議的。很多硬件廠家為了適配該系統(tǒng),必須將在上面研發(fā)的驅(qū)動(dòng)程序公開,一旦公開驅(qū)動(dòng)程序代碼就相當(dāng)于公開了自己的硬件設(shè)計(jì)。而谷歌研發(fā)的Android系統(tǒng)解決了這個(gè)問題,它將驅(qū)動(dòng)程序放置到了userspace里面,并讓它可以通過l內(nèi)核訪問硬件。同時(shí),公開接口就可以讓硬件廠商編寫驅(qū)動(dòng)程序。硬件廠商只需要提供驅(qū)動(dòng)程序即可,不需要公開源代碼了。
這么多硬件廠商一起研發(fā),自然就會(huì) 面臨一個(gè)問題就是每個(gè)廠商的硬件都不同。這對Android生態(tài)發(fā)展來說是個(gè)必須解決的兼容性問題。最好的辦法依然是沿用linux的虛擬機(jī)機(jī)制 ,這樣Android的軟件作者就無需針對不同硬件重新開發(fā)軟件。只需要一次開發(fā)就可以在安卓系統(tǒng)上的虛擬機(jī)中運(yùn)行。
3、華為的方舟編譯器
安卓的虛擬機(jī)機(jī)制在很大程度上解決了兼容性的問題,但是這種邊解釋邊執(zhí)行的方式,也降低了軟件的運(yùn)行效率。這些年,華為在這方面的研發(fā)上花了大功夫,成功研制出了“方舟”編譯器。該編譯器就是為了解決這個(gè)問題而誕生的。如果軟件作者采用方舟編譯器重新編譯自己的程序。它的軟件就可以以機(jī)器碼的形式在安卓系統(tǒng)上高效運(yùn)行,并且方舟編譯器還會(huì)對程序進(jìn)行優(yōu)化。按照華為方面的數(shù)據(jù)顯示, 使用華為方舟編譯器編譯后的程序,操作流暢度提升24%,系統(tǒng)響應(yīng)速度提升44%,第三方應(yīng)用操作流暢度提升60%!
總結(jié)
Android沒有繞開虛擬機(jī)直接運(yùn)行,是因?yàn)閺乃邪l(fā)之初為了保持高兼容性,不得不沿用了虛擬機(jī)的機(jī)制。但在這些年,華為研發(fā)了“方舟”編譯器,就是為了解決這個(gè)問題。通過方舟編譯器編譯后的程序可以直接以機(jī)器碼的形式在安卓系統(tǒng)上運(yùn)行,效率大大提高。
為了多點(diǎn)兒面試題[機(jī)智]
當(dāng)初設(shè)計(jì)android的時(shí)候,設(shè)計(jì)人員只是軟件工程師,無法針對某個(gè)CPU(目前有的CPU框架intel,arm,mips,rsicv等)去開發(fā)。最好的是,我針對所有CPU都支持。
跨平臺(tái),是指java語言編寫的程序,一次編譯后,可以在多個(gè)系統(tǒng)平臺(tái)上運(yùn)行。
因?yàn)闄C(jī)器針對不同機(jī)器語言,有不同執(zhí)行邏輯。
就好比二進(jìn)制000100,在arm里面是調(diào)用加法器,而riscv是調(diào)用乘法器一樣。所以,需要給這些不同平臺(tái)請個(gè)翻譯。而虛擬機(jī)就是起到翻譯作用。
這樣雖然增加了消耗(例如執(zhí)行同樣代碼,時(shí)間消耗上,c明顯由于java),但是可以某種意義上,把軟件,物理硬件分開了。軟件重點(diǎn)設(shè)計(jì)自己app,而硬件不斷增加CPU性能。
因?yàn)樯蠈討?yīng)用是 建立在 java 庫的基礎(chǔ)上,運(yùn)行 java 庫 需要 java 虛擬機(jī),調(diào)試模式,可以登錄到系統(tǒng)里,直接運(yùn)行l(wèi)inux 命令,也可以下載運(yùn)行 c程序。
啥叫Android不可以繞開虛擬機(jī)直接運(yùn)行?Android本質(zhì)上是Linux的變種,它本身就是應(yīng)用APP的虛擬機(jī)容器,Android源碼針對硬件平臺(tái)編譯之后,就是直接在CPU上運(yùn)行的機(jī)器碼了,它的運(yùn)行并不依賴于其他的虛擬機(jī)。
APP是JAVA打包的,倒是需要在Android的JVM里運(yùn)行,畢竟要考慮跨平臺(tái)嘛。
ActivityThread.java就是一個(gè)應(yīng)用程序,有main方法,是一個(gè)進(jìn)程,就是靠虛擬機(jī),沒有這個(gè)就沒有app。咋繞開,繞開就得不用這個(gè),得從內(nèi)部更換成別的,都更換了那就不是簡單的事情了
因?yàn)閖ava代碼必須編譯成機(jī)器語言才行,這時(shí)候就要接助虛擬機(jī)
在問為什么前,先問下是什么?Android是可以不依賴虛擬機(jī)運(yùn)行的,只需要改一下重新編譯就好了。
系統(tǒng)就是這么設(shè)計(jì)的
舉個(gè)例子
LinearLayout
TextView?/
/LinearLayout
這個(gè)LinearLayout就是TextView的父容器啦,也就是相對這個(gè)控件或者布局而言,他的上一級(jí)就是父容器啦。容器就是用來裝東西的嘛,父就是父親嘛,上一個(gè)等級(jí)(生物學(xué)和物理學(xué)都出來了哈哈)
Android 的UI 可以分為兩類,一類叫做ViewGroup容器,一類叫做View視圖
View視圖:(TextView,Button,ImageView)都是常用常見的視圖.
ViewGroup容器:內(nèi)部可以承載、放置、添加View視圖
線性布局就是 從左到右 或 從上到下 按 順序排列 的一種布局。下面講一講LinearLayout的基礎(chǔ)屬性。
相對布局在擺放子視圖位置時(shí),按照 指定的參考系 來擺放子視圖的位置, 默認(rèn)以屏幕左上角(0,0)位置 作為 參考系 擺放位置
使用layout_below使得后面一個(gè)組件位于前面一個(gè)組件的下方
配合layout_toRightOf使得后面一個(gè)組件位于前面一個(gè)組件的右方
組件的默認(rèn)位置都是左上角,組件之間可以重疊。像千層餅一樣,一層壓著一層 可以設(shè)置上下左右的對齊、水平垂直居中、設(shè)置方式與線性布局相似
參考: 2021Android從零入門到實(shí)戰(zhàn)(Kotlin版)