Android無pading超簡單超實用陰影解決方案

前言

這個迭代,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會報錯 我只是強制屏蔽了。

有沒有更好的解決方式?

希望大家能分享分享!

最後

如果你看到了這裏,覺得文章寫得不錯就給個讚唄?如果你覺得那裏值得改進的,請給我留言。一定會認真查詢,修正不足。謝謝。

推薦閱讀:“寒冬未過”,阿里P9架構分享Android必備技術點,讓你offer拿到手軟! 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章