寫這個(gè)控件的目的
有一次, 在我的工作當(dāng)中遇到了這樣的一個(gè)需求,要實(shí)現(xiàn)陰影的效果,需求圖如下:

其實(shí)粗略一看,要實(shí)現(xiàn)這個(gè)陰影 用cardView, 但是當(dāng)我用了cardView 實(shí)現(xiàn)后 滿足不了產(chǎn)品的要求,cardView實(shí)現(xiàn) 的陰影太黑,不夠溫柔,網(wǎng)上找的也滿足不了自己的需求。于是自己花了點(diǎn)時(shí)間實(shí)現(xiàn)了一下。
使用方式
在根目錄的build.gradle 引入maven
maven { url 'https://dl.bintray.com/richzjc/maven' }
在module的 dependencies下面添加
implementation 'com.richzjc:ShadowLib:1.0.15'
注意: 當(dāng)前控件包裹的子控件只能有一個(gè)
示例
<com.richzjc.shadowlib.MyShadowLayout
android:layout_width="wrap_content"
android:layout_height="200dp"
android:background="#000"
android:paddingLeft="10dp"
app:hl_shadowRadius="30dp"
app:hl_cardCornerRadius="10dp"
app:hl_shadowSolidColor="#123456"
app:hl_bottomShow="true"
app:hl_topShow="true"
app:hl_rightShow="true"
>
<TextView
android:layout_width="100dp"
android:layout_height="100dp"
android:background="#f00" />
</com.richzjc.shadowlib.MyShadowLayout>
控件屬性介紹
<declare-styleable name="ShadowLayout">
<attr name="hl_topShow" format="boolean" />
<attr name="hl_bottomShow" format="boolean" />
<attr name="hl_leftShow" format="boolean" />
<attr name="hl_rightShow" format="boolean" />
<attr name="hl_shadowRadius" format="dimension"/>
<attr name="hl_cardCornerRadius" format="dimension"/>
<attr name="hl_shadowColor" format="color|reference"/>
<attr name="hl_shadowSolidColor" format="color|reference"/>
</declare-styleable>
hl_topShow: 是否顯示上陰影
hl_bottomShow: 是否顯示下陰影
hl_leftShow: 是否顯示左陰影
hl_rightShow: 是否顯示右陰影
hl_shadowRadius: 陰影的寬度
hl_cardCornorRadius: 圓角
hl_shadowColor: 陰影的顏色值
hl_shadowSolidColor: 基本上用不到
效果圖
貌似 上傳上來的效果圖 陰影看著不是很明顯, 可以下載github的項(xiàng)目 在真機(jī)上面查看


其它情況的效果圖請(qǐng)下載項(xiàng)目自己修改屬性運(yùn)行后查看
原理
該控件是屬于一個(gè)組合控件, MyShadowLayout是對(duì)外暴露的一個(gè)控件,用于在布局里面使用。
但是在源碼里面還包括了MyCardView, ShadowView兩個(gè)控件。
而這兩個(gè) 控件是直接添加在了MyShadowLayout里面。
其作用:
MyCardView
主要控件圓角
ShadowView
主要實(shí)現(xiàn)的是陰影的效果
MyShadowLayout
類似于一個(gè)管家的作用, 重寫了OnMeasure方法, onLayout方法
雖然在布局里面MyShadowLayout作為父控件,包裹了子控件。
但真正實(shí)現(xiàn)的邏輯是包裹的子控件最終是添加在了MyCardView上面的
其它文章:
kotlin DSL開發(fā)
android 面試題
android 夜間模式的切換
快速獲取Bundle里面參數(shù)
android EventBus源碼閱讀
AOP之動(dòng)態(tài)代理原理
Handler源碼理解
IOC框架之Dagger詳解
多學(xué)總比少學(xué)好
所謂 面試造飛機(jī), 入職擰螺絲。 這句話一點(diǎn)也不假, 面試時(shí)的技術(shù)不僅僅 是 要學(xué)會(huì)用, 還得要知其原理。懂其原理,才能區(qū)分其技術(shù)水平, 而作為android開發(fā)的我們, java作為我們的開發(fā)語言。 所以面試官往往會(huì)問一些java底層的原理。這其中包括, java 多線程, 各種各樣的鎖機(jī)制, 以及cas, 原子性 的問題。