目錄介紹
- 01.陰影效果有哪些實現方式
- 02.實現陰影效果Api
- 03.設置陰影需要注意哪些
- 04.常見Shape實現陰影效果
- 05.自定義陰影效果控件
- 06.如何使用該陰影控件
- 07.在recyclerView中使用注意點
01.陰影效果有哪些實現方式
- 陰影效果有哪些實現方式
- 第一種:使用CardView,但是不能設置陰影顏色
- 第二種:采用shape疊加,存在后期UI效果不便優化
- 第三種:UI切圖
- 第四種:自定義View
- 否定上面前兩種方案原因分析?
- 第一個方案的CardView漸變色和陰影效果很難控制,只能支持線性或者環裝形式漸變,這種不滿足需要,因為陰影本身是一個四周一層很淡的顏色包圍,在一個矩形框的層面上顏色大概一致,而且這個CardView有很多局限性,比如不能修改陰影的顏色,不能修改陰影的深淺。所以這個思路無法實現這個需求。
- 第二個采用shape疊加,可以實現陰影效果,但是影響UI,且陰影部分是占像素的,而且不靈活。
- 第三個方案詢問了一下ui。他們給出的結果是如果使用切圖的話那標注的話很難標,身為一個優秀的設計師大多對像素點都和敏感,界面上的像素點有一點不協調那都是無法容忍的。
- 在下面開源案例代碼中,我會一一展示這幾種不同方案實現的陰影效果。
- 網上一些介紹陰影效果方案
- 所有在深奧的技術,也都是為需求做准備的。也就是需要實踐並且可以用到實際開發中,這篇文章不再抽象介紹陰影效果原理,理解三維空間中如何處理偏移光線達到陰影視差等,網上看了一些文章也沒看明白或者理解。這篇博客直接通過調用api實現預期的效果。
- 陰影是否占位
- 使用CardView陰影不占位,不能設置陰影顏色和效果
- 使用shape陰影是可以設置陰影顏色,但是是占位的
02.實現陰影效果Api
- 思考一下如何實現View陰影效果?
- 首先要明確陰影的實現思路是什么,其實就是顏色導致的視覺錯覺。說白了就是在你的Card周圍畫一個漸變的體現立體感的顏色。基於上述思路,我們在一個在一個view上畫一個矩形的圖形,讓他周圍有漸變色的陰影即可。於是我們想起幾個API:
- 類:Paint 用於在Android上畫圖的類,相當於畫筆
- 類:Canvas 相當於畫布,Android上的view的繪制都與他相關
- 方法:paint.setShadowLayer可以給繪制的圖形增加陰影,還可以設置陰影的顏色
- paint.setShadowLayer(float radius, float dx, float dy, int shadowColor);
- 這個方法可以達到這樣一個效果,在使用canvas畫圖時給視圖順帶上一層陰影效果。
- 簡單介紹一下這幾個參數:
- radius: 陰影半徑,主要可以控制陰影的模糊效果以及陰影擴散出去的大小。
- dx:陰影在X軸方向上的偏移量
- dy: 陰影在Y軸方向上的偏移量
- shadowColor: 陰影顏色。
- 終於找到了設置顏色的,通過設置shadowColor來控制視圖的陰影顏色。
03.設置陰影需要注意哪些
- 其中涉及到幾個屬性,陰影的寬度,view到Viewgroup的距離,如果視圖和父布局一樣大的話,那陰影就不好顯示,如果要能夠顯示出來就必須設置clipChildren=false。
- 還有就是視圖自帶的圓角,大部分背景都是有圓角的,比如上圖中的圓角,需要達到高度還原陰影的效果就是的陰影的圓角和背景保持一致。
04.常見Shape實現陰影效果
- 多個drawable疊加
- 使用layer-list可以將多個drawable按照順序層疊在一起顯示,默認情況下,所有的item中的drawable都會自動根據它附上view的大小而進行縮放,layer-list中的item是按照順序從下往上疊加的,即先定義的item在下面,后面的依次往上面疊放
- 陰影效果代碼如下所示
- 這里有多層,就省略了一些。然后直接通過設置控件的background屬性即可實現。
05.自定義陰影效果控件
- 首先自定義屬性
- 代碼如下所示
06.如何使用該陰影控件
- 十分簡單,如下所示
07.在recyclerView中使用注意點
- 在createShadowBitmap方法中,其實也可以看到需要創建bitmap對象。大家都知道bitmap比較容易造成內存過大,如果是給recyclerView中的item設置陰影效果,那么如何避免重復創建,這時候可以用到緩存。所以可以在上面的基礎上再優化一下代碼。
- 先創建key,主要是用於map集合的鍵。這里為何用對象Key作為map的鍵呢,這里是借鑒了glide緩存圖片的思路,可以創建Key對象的時候傳入bitmap名稱和寬高屬性,並且需要重寫hashCode和equals方法。
- 然后存取操作如下所示
- 在查找的時候,通過Key進行查找。注意:Bitmap需要同時滿足三個條件(高度、寬度、名稱)都相同時才能算是同一個 Bitmap。
其他介紹
01.關於博客匯總鏈接
02.關於我的博客
- github:https://github.com/yangchong211
- 知乎:https://www.zhihu.com/people/yczbj/activities
- 簡書:http://www.jianshu.com/u/b7b2c6ed9284
- csdn:http://my.csdn.net/m0_37700275
- 喜馬拉雅聽書:http://www.ximalaya.com/zhubo/71989305/
- 開源中國:https://my.oschina.net/zbj1618/blog
- 泡在網上的日子:http://www.jcodecraeer.com/member/content_list.php?channelid=1
- 郵箱:yangchong211@163.com
- 阿里雲博客:https://yq.aliyun.com/users/article?spm=5176.100- 239.headeruserinfo.3.dT4bcV
- segmentfault頭條:https://segmentfault.com/u/xiangjianyu/articles
- 掘金:https://juejin.im/user/5939433efe88c2006afa0c6e