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

前言

這個迭代,UI在給了幾張帶陰影的圖片,那種陰影範圍很大,實際內容卻只有一點的圖片。
效果相似這樣。 html

不知道這張圖有沒有表達清楚,就是那種圖片之間陰影須要重疊才能使內容對其,陰影還有顏色的效果。
Android 5.0後才支持elevation屬性,還不支持陰影顏色的設定。IOS同事笑了,他們說直接把陰影效果給他們,不要帶陰影的圖片,他們自然支持陰影,能夠直接繪製。android

因而,上網搜索,發現目前Andorid 平臺實現陰影大概有這麼幾種方式
一、使用.9圖 inloop.github.io/shadow4andr…
二、CardView 不支持陰影顏色
三、開源庫ShadowLayout
四、模仿FloatingActionButton 實現陰影等等。
這些方式是能夠實現陰影的顯示,可是基本都是將陰影做爲控件的一部分去實現的。這樣,就須要給控件設置一些padding值,才能讓陰影顯示出來。這種方式使得佈局很不方便對齊。git

個人解決方案

先上效果看看github

既然將陰影做爲控件的一部分去實現不利於控件的佈局和對其,那就咱就在ViewGroup裏去實現陰影。繪製的時候根據子view的位置繪製出陰影,這樣就不會影響控件的佈局和對其了。bash

其實我以爲控件的陰影自然就應該在父佈局去實現,就像現實中的陰影那樣。oop

實現思路

一、繼承ViewGoup

Android 中有FrameLayout、LinearLayout、RelativeLayout、ConstraintLayout等等,這些layout是爲了進行子view佈局而設計的,若是不進行背景色的設置,默認是不走ondraw方法的。佈局

咱們能夠繼承這些ViewGroup,設置setWillNotDraw(false)標誌位強制進行繪製,這樣咱們就既擁有了佈局的功能,也擁有了繪製的功能。而後就能在onDraw方法中,根據子view的位置繪製背景了。post

二、複寫onDraw方法繪製子view背景

這一步很簡單,一個循環遍歷子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,感受效果還不錯。

使用起來大概像這樣。

項目地址 github.com/ZhangHao555…

須要改進

一、繪製陰影的時候有沒有更好、更逼真的繪製方式?
二、項目中使用自定義屬性 lint會報錯 我只是強制屏蔽了。

有沒有更好的解決方式?

但願你們能分享分享!

另外 附上另外一篇文章 RecyclerView實現banner 滑動縮放、循環滑動效果 juejin.im/post/5d05df…

相關文章
相關標籤/搜索