在Android L推出后,Google提出了全新的設計語言:材質設計。其中很重要的一點就是陰影效果的使用,你可以為每一個View設置一個elevation
值,相當於除了x、y之外的z值,z值決定了陰影的大小,z值越大表示陰影越大。z值包含兩個成分:elevation
和translation
。elevation是一個靜態的成分,translation
使用了動畫:Z = elevation + translationZ
。
在layout中設置elevation
,使用android:elevation
屬性。在代碼中設置,使用View.setElevation()
方法。設置一個View的translation
,使用View.setTranslationZ()
方法。ViewPropertyAnimator.z()
和ViewPropertyAnimator.translationZ()
能使你更輕易的推動Views的elevation
。
因此,想要在5.0(API 21)以及以后想要設置陰影非常簡單我們只需要設置elevation
屬性就可以了。比如我們想讓一張圖片顯示陰影:
1 |
<ImageView |
需要注意的一點是:必須要設置background
並且不能設置是透明背景,這樣在真機上才能顯示出來,沒有設置的話預覽能顯示,但是真機並沒有效果,在ViewGroup
中也是一樣。
那我們想在5.0之前也實現陰影效果怎么辦呢?有兩個辦法:第一種是自定義layer-list,第二種辦法是使用nine-patch圖片。
先來看看nine-patch方案:大概原理就是使用一張邊界是陰影效果的.9圖片,然后設置為背景,可以讓美工幫忙切一張,也可以使用系統自帶的,有個叫android:background="@android:drawable/dialog_holo_light_frame
”,設置后的效果就是帶陰影的效果。
再來看看layer-list方案,如果我們需要一張矩形的陰影效果,則大概應該這么定義:
1 |
<?xmlversion="1.0"encoding="utf-8"?> |
原理就是沿着邊界一層一層的繪制,顏色由深到淺。
同樣,如果需要實現像FAB(Floating ActionBar)一樣的陰影效果,也能這么定義,把矩形換做圓形即可:
1 |
<?xmlversion="1.0"encoding="utf-8"?> |
這樣就能實現通用平台的陰影效果了,還有一點不要被迷惑了,support-v4里面有個ViewCompat.setElevation(iv, 2.0f);
方法,試驗證明是沒用的。
更多的學習大家可以參考API DEMO的ShadowCardDrag
和ShadowCardStack
兩個Demo。
最后來看看實現的效果圖:
第一個是使用的.9背景圖片,也就是之前提到的屬性,第二個和第三個是使用的layer-list,最后一個是使用的elevation屬性。