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