android布局demo
㈠ 【Android進階】RecyclerView:打造一個懸浮效果的Demo
先欣賞一個效果。
這是一個城市列表,每個城市屬於一個省,需要在滑動時讓對應省份浮於頂部,隨著列表滑動,浮於頂部的省份位置相應調整,實現「頂上去」的視覺效果。
實現思路圍繞RecyclerView.ItemDecoration展開。ItemDecoration,字面理解為「Item裝飾」。其實,它功能強大,而我們通常僅用它繪制分割線。其實,ItemDecoration不僅能繪制分割線,還擁有更多功能。
查看RecyclerView.ItemDecoration源碼(部分)。
其包含了常用方法:RecyclerView的背景、onDraw繪制的內容、Item、onDrawOver繪制的內容。層級關系如下:
一般情況下,分割線繪制如下:
獲取當前RecyclerView的Item數量,遍歷每個Item,對應位置繪制矩形,完成分割線效果。
打造懸浮效果的實現:
這是一個城市列表,按省份分組,相同城市僅顯示一個省份。滑動列表時,省份會浮於頂部。效果如下:
為了實現懸浮效果,在onDrawOver中繪制分組。
通過position對比上一個省份名稱,判斷當前省份是否為首項。
僅當為首項或新省份時,為懸浮欄預留空間。
通過變數preGroupId和currentGroupId保存當前分組名和上一個分組名。當前Item與上一個Item同組時跳過繪制。代碼實現如下:
根據當前Item位置確定分組繪制位置。top設為mGroupHeight和view.getTop()的最大值,確保top不低於mGroupHeight,實現吸頂效果。
當下個分組頂部(當前Item底部近似下個Item頂部)距RecyclerView頂部小於top時,調整當前分組位置,實現在下一個分組上滑時當前分組上移,上一個分組下滑時當前分組下移。
計算baseLine並繪制背景和文字。
至此,帶有懸浮功能的列表實現完成。
進階:利用ItemDecoration實現文字懸浮時,是否還能有更多操作?如添加圖標、多個TextView、自定義布局?實現方式類似,僅需在介面中添加獲取View的方法。
實現原理與之前相同,由於需要自定義布局,需添加介面的getGroupView方法,用於獲取需繪制的分組View,並將其繪制至指定位置。
效果展示如下:
實現詳細代碼請參閱底部鏈接。
已封裝成庫,歡迎提出問題和建議。
具體用法及源碼請訪問GitHub。
閱讀後請點贊,養成習慣,關注公眾號「程序猿養成中心」,獲取更多干貨。此外,Android一線大廠面試完整考點、資料更新在我【GitHub】上,面試有需求的朋友可參考,如對您有幫助,請給予Star支持。
Github鏈接:https://github.com/733gh/xiongfan
㈡ android一個頁面可以有幾種布局方法嗎
在Android開發中,界面布局是構建用戶界面的重要部分。布局類型多樣,適用於不同場景。五大常用布局分別為:LinearLayout、FrameLayout、RelativeLayout、AbsoluteLayout、TableLayout。
LinearLayout通過垂直或水平順序排列子元素,形成界面結構。垂直排列時,形成N行單列結構,水平排列時,形成單行N列結構。構建復雜結構時,通常使用嵌套的LinearLayout。
FrameLayout是最簡單的布局方式,整個界面被視為一塊空白區域,所有子元素默認置於左上角。後續元素會覆蓋前一個元素,實現覆蓋效果。此布局方式不常用,因代碼較為僵硬,難以適應不同終端。
AbsoluteLayout允許通過設置子元素的坐標位置進行布局,坐標原點位於屏幕左上角。子元素可以相互重疊,但開發中較少使用,因為代碼過於固定。
RelativeLayout依據各子元素間的位置關系進行布局,支持通過android:layout_below、android:layout_above等屬性指定位置。此布局方式較為靈活,適合復雜界面設計。
TableLayout是LinearLayout的子類,其寬度和高度屬性固定為MATCH_PARENT和WRAP_CONTENT。因此,其子元素都為橫向排列,寬度和高度一致,類似於表格中的單元格。在TableLayout中,單元格不能跨列,保證布局整齊。
這五大布局各具特色,開發者可根據具體需求選擇合適布局方式,構建高效、美觀的Android界面。
㈢ android中怎麼動態的載入一個布局
由於前段時間項目需要,需要在一個頁面上載入根據不同的按鈕載入不同的布局頁面,當時想到用 tabhot 。不過美工提供的界面圖完全用不上tabhot ,所以想到了動態載入的方法來解決這一需求。在這里我整理了一下,寫了一個 DEMO 希望大家以後少走點彎路。
首先,我們先把界面的框架圖畫出來,示意圖如下:
㈣ Android 將App的內容延伸到狀態欄/導航欄
來自我的CSDN博客: http://blog.csdn.net/dahaohan/article/details/52175190
看過Android的桌面應用都是介樣的:
如何讓自己的應用也達到這般效果呢?這里就介紹幾種常用的方法以及它們之間的區別。
首先展示下此次demo的布局和初始狀態:
初始效果圖如下:
使用這個方式首先要理解幾個概念,窗口層級以及窗口background/窗口透明:
Google在API-19 以及API-21新增對狀態欄/導航欄窗口透明和顏色的控制:
對應的在主題內即可控制:
這里首先要明了這里狀態欄和導航欄窗口是系統級窗口而Activity對應的時應用窗口,它們屬於不同的窗口層級;
然後狀態欄/導航欄系統級窗口是在App應用窗口之上,故而Activity應用窗口雖然有整個屏幕的大小,但是可顯示內容的區域得除去其上疊加的不透明的窗口區域。詳細的窗口計算繪制可參考大神老羅的博文:
Android窗口管理服務WindowManagerService計算Activity窗口大小的過程分析
下面來使用主題控制導航欄/狀態欄透明,同時看看上述兩種設置透明的方式效果有何不同:
初始桌面和啟動Activity效果圖:
可以看到雖然導航欄/狀態欄透明了,當時應用窗口顯示的內容依然只是除去了兩個系統窗口之外的區域,並沒有衍生到導航欄/狀態欄之下。
效果如下:
可以看到已經將應用的內容布局延伸到導航欄/狀態欄下方了,來看看關於android:windowTranslucentStatus
android:windowTranslucentNavigation的官方說明看看來理解其與設置color transparent的區別:
根據FLAG的說明,可以看出設置該標志位等同於View申請設置:
PS:從效果圖看,雖然布局延伸到狀態欄導航欄區域,但是相應的內容「hello world」文字也被狀態欄/導航欄遮住了。在布局根視圖設置fitsSystemWindows為true可以使得,系統自動為視圖添加一個狀態欄/導航欄高度的padding:
效果如下:
查看SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 和 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN的說明,可以發現其實還有兩個非常接近的FLAG:
根據官方的說明提示,SYSTEM_UI_FLAG_FULLSCREEN / SYSTEM_UI_FLAG_HIDE_NAVIGATION主要用於動態切換隱藏/顯示系統導航欄/狀態欄;例如書籍閱讀應用/視頻播放應用等。而像游戲類的全屏應用則推薦使用window flag。
上述的透明導航欄/狀態欄等API基本是需要API-19或是API-21才能使用的,這里還有一種API-1的方案能夠實現布局內容全屏:
實際上只需要設置FLAG_LAYOUT_NO_LIMITS就足夠了;這FLAG是看Android原生的Launcher / Keyguard源碼,看到有用到如此設置,其窗口設置具體原理我也沒有弄清..... 有大神了解可以指點下。
PS:這個套路下,使用fitsSystemWindows="true"是無效的,智能自己控制號布局位置。