Android打造萬能自定義陰影控件


目錄介紹

  • 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.關於我的博客

開源案例地址:https://github.com/yangchong211/YCCardView


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM