最近項目要求,ui有很多有關於陰影的設計要求,網上找了些實現方式,但都不是很理想。現在閑下來了,就尋思着自己寫個陰影布局耍耍,以備后用。先說道說道我找到的幾種陰影實現方式:
系統陰影
Andorid 系統自api 21之后就多了一個熟悉 android:elevation ,這是android最新引入的軸的概念,可通過設置elevation來設置陰影(z軸的大小),設置如下:
效果也是不錯,可以完成一些簡單的陰影設置效果。
但需要注意些細節,不然 elevation 可能會無效:
- 父布局要保留足夠的空間,elevation本身不占有view的大小
- 需要設置背景色且不可設置為透明色
- 不能設置是否為擴散的還是指定方向的
layer-list 偽陰影
為什么說是偽陰影呢,layer-list本身很強大,器支持的層疊式繪制基本可以解決我們大多說的背景設計,對於一些要求不是很嚴格的陰影用它也不是不可以,但效果是真的不好,畢竟shape提供的層疊()並不支持模糊繪制(或者可以選擇使用模糊背景圖片繪制)。下面給一個用layer-list繪制的陰影做參考。
效果比較生硬,其本質就是顏色的漸變,如下:
還有如讓ui切陰影背景圖,但由於控件大小規格差異較大,風格差異較大,並不推薦使用。
自定義陰影布局
這是我比較推薦的方式,可參考CardView的陰影實現自定義一個陰影布局實現。其實現是通過 setShadowLayer、setMaskFilter 實現。
相較於 setShadowLayer 來說,setMaskFilter 可供選中的實現方式要多一個blur實現類型,效果更好些,所以我是通過使用 setMaskFilter 來實現自定義陰影布局。
使用
ShadowView 托管於GitHub, 仿照css的Box Shadow 的陰影實現效果設計實現,可通過設置水平、豎直偏移確認陰影方向,可設置模糊半徑和圓角半徑、陰影顏色等。可通過gradle直接依賴使用:
添加依賴
repositories {
//...
maven { url 'https://jitpack.io' }
}
dependencies {
implementation 'com.github.amikoj:ShadowView:1.0.1'
}
xml中使用
屬性說明
屬性名 | 類型 | 說明 |
---|---|---|
shadowColor | color | 陰影渲染顏色 |
shadowRadius | dimension | 背景圓角半徑(0為矩形) |
blurRadius | dimension | 模糊半徑 |
xOffset | dimension | 水平位移 |
yOffset | dimension | 豎直位移 |
bgColor | color | 背景色 |
代碼設置
也可通過代碼設置陰影屬性: