前言
這個迭代,UI在給了幾張帶陰影的圖片,那種陰影範圍很大,實際內容卻只有一點的圖片。
效果類似這樣。
不知道這張圖有沒有表達清楚,就是那種圖片之間陰影需要重疊才能使內容對其,陰影還有顏色的效果。
Android 5.0後才支持elevation屬性,還不支持陰影顏色的設定。IOS同事笑了,他們說直接把陰影效果給他們,不要帶陰影的圖片,他們天然支持陰影,可以直接繪製。
於是,上網搜索,發現目前Andorid 平臺實現陰影大概有這麼幾種方式
1、使用.9圖 inloop.github.io/shadow4andr…
2、CardView 不支持陰影顏色
3、開源庫ShadowLayout
4、模仿FloatingActionButton 實現陰影等等。
這些方式是可以實現陰影的顯示,但是基本都是將陰影作爲控件的一部分去實現的。這樣,就需要給控件設置一些padding值,才能讓陰影顯示出來。這種方式使得佈局很不方便對其。
我的解決方案
先上效果看看
既然將陰影作爲控件的一部分去實現不利於控件的佈局和對其,那就咱就在ViewGroup裏去實現陰影。繪製的時候根據子view的位置繪製出陰影,這樣就不會影響控件的佈局和對其了。
其實我覺得控件的陰影天然就應該在父佈局去實現,就像現實中的陰影那樣。
實現思路
1、繼承ViewGoup
Android 中有FrameLayout、LinearLayout、RelativeLayout、ConstraintLayout等等,這些layout是爲了進行子view佈局而設計的,如果不進行背景色的設置,默認是不走ondraw方法的。
我們可以繼承這些ViewGroup,設置setWillNotDraw(false)標誌位強制進行繪製,這樣我們就既擁有了佈局的功能,也擁有了繪製的功能。然後就能在onDraw方法中,根據子view的位置繪製背景了。
2、複寫onDraw方法繪製子view背景
這一步很簡單,一個循環遍歷子view就好了
如何繪製
1、繪製之前 需要設置 setLayerType(View.LAYER_TYPE_SOFTWARE, null)關閉硬件加速,因爲一些高級繪製方法可能不支持硬件加速。
2、爲paint設置 shadowLayer
paint.setShadowLayer(shadowLayoutParams.shadowRadius, shadowLayoutParams.xOffset
, shadowLayoutParams.yOffset, shadowLayoutParams.shadowColor);
3、2那種繪製方式邊緣有些整齊,可能會不滿足需求。這裏還有一種方式,爲 Paint設置MaskFilter。 具體可以看看這篇文章 www.cnblogs.com/tianzhijiex…
我的實現
我個人比較喜歡使用ConstraintLayout等等,所以繼承ConstraintLayout實現了一個demo,感覺效果還不錯。
使用起來大概像這樣。
需要改進
1、繪製陰影的時候有沒有更好、更逼真的繪製方式?
2、項目中使用自定義屬性 lint會報錯 我只是強制屏蔽了。
有沒有更好的解決方式?
希望大家能分享分享!
最後
如果你看到了這裏,覺得文章寫得不錯就給個讚唄?如果你覺得那裏值得改進的,請給我留言。一定會認真查詢,修正不足。謝謝。