假設我們要做一個效果,界面最頂部是一個 ActionBar 并且是半透明的,ActionBar 下面是一個 ListView,在初始狀態下,ListView 是 top 是在 ActionBar 的 bottom 位置的,但當 ListView 滾動的時候可以透過 ActionBar 看到下面的 ListView 的內容。如下面兩張圖所示:
正常態:
滾動態:
乍一看,不是很簡單嗎,只要設置一下 marginTop 或者 paddingTop 就可以了,但問題是只用這兩個其中一個屬性的話,ListView 滑動的時候就不能滾到 paddingTop 或者 marginTop 那部分區域,有人說可以用 HeaderView 來解決,這是其中一個辦法,但僅僅了為這個占空使用 HeadView 有點浪費而且會影響 onItemClick 的 position. 于是這里介紹可以到這個效果的兩個屬性,就是 android:clipToPadding 和 android:clipChildren, 這兩個屬性不是太多人用到,這里說明一下
clipToPadding 就是說控件的繪制區域是否在 padding 里面的,true 的情況下如果你設置了 padding 那么繪制的區域就往里縮,clipChildren 是指子控件是否超過 padding 區域,這兩個屬性默認是 true 的,所以在設置了 padding 情況下,默認滾動是在 padding 內部的,要達到上面的效果主要把這兩個屬性設置了 false 那么這樣子控件就能畫到 padding 的區域了。
1 2 3 4 5 6 7 8 |
<ListView android:layout_gravity="center_vertical" android:id="@+id/list" android:clipChildren="false" android:clipToPadding="false" android:paddingTop="50dip" android:layout_width="match_parent" android:layout_height="match_parent"> |
Actionbar 半透明就不詳細說了,只要設置 actionbarOverlay 為 true 并為 ActionBar 設置一個半透明的 background 即可.
美圖共賞 2016 年 4 月 14 日
美圖在這里:http://www.fydzv.com/
Longerian 2016 年 4 月 13 日
這個屬性有種相見恨晚的感覺
林貞恩 2016 年 1 月 25 日
非常高興遇到這么好的文章 謝謝
徐小木 2016 年 1 月 22 日
好,值得細看,佩服
MewX 2016 年 1 月 18 日
Good, listView 如果使用 CoordinatorLayout,就不需要主動設置 padding 了。
堇色流年 2014 年 12 月 25 日
ListView paddingTop 的高度應該是通知欄高度+actionbar 的高度吧。實際在 MX 中我用了 76dip 左右才剛好。