/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 - present , ĠSur f Studio ĠLLC . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġru . surf studio . android . custom . view . shadow Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics .* Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroidx . annotation . Color Int Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . dis pos ables . Dis pos ables Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġru . surf studio . android . custom . view . R Ċ import Ġru . surf studio . android . image loader . util . Blur Util Ċ import Ġru . surf studio . android . logger . Logger Ċ Ċ /** Ċ Ġ* ĠLayout Ġthat Ġcreates Ġbl urred Ġshadow Ġof Ġits Ġchildren . Ċ Ġ* Ċ Ġ* ĠHow Ġit Ġworks : Ċ Ġ* Ġ 1 . ĠChildren Ġare Ġdrawn Ġon Ġthe Ġcanvas . Ċ Ġ* Ġ 2 . ĠThis Ġcan v ases Ġbitmap Ġis Ġbl urred Ġby Ġstack Ġblur Ġalgorithm . Ċ Ġ* Ġ 3 . ĠBl urred Ġbitmap Ġis Ġstored Ġin Ġ[ shadow Bitmap ] Ġfor Ġreuse Ġduring Ġnext Ġ[ dispatch Draw ] Ġpasses . Ċ Ġ* ĠĠĠ ĠEvery Ġnext Ġpass Ġwill Ġskip Ġfirst Ġthree Ġsteps , Ġif Ġ[ shadow Bitmap ] Ġexists . Ċ Ġ* Ġ 4 . ĠChildren Ġare Ġdrawn Ġone Ġmore Ġtime Ġon Ġthe Ġtop Ġof Ġthe Ġbl urred Ġbitmap . Ċ Ġ* Ċ Ġ* ĠIf Ġthe Ġcontent Ġof Ġthe Ġlayout Ġhas Ġbeen Ġchanged , Ġshadow Ġcould Ġbe Ġupdated Ġwith Ġ[ redraw Shadow ] Ġmethod . Ċ Ġ* Ċ Ġ* ĠSome Ġshadow Ġparameters Ġcould Ġbe Ġmodified Ġfrom Ġ. xml Ġ( offsets , Ġblur Ġradius , Ġshadow Ġalpha , Ġetc .). Ċ Ġ* ĠFor Ġmore Ġinformation Ġsee Ġ/ res / attrs . xml . Ċ Ġ*/ Ċ open Ġclass ĠShadow Layout Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġdef Style Attr : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠFrame Layout ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ IS _ ASYNC Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ RADIUS Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ OFFSET Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ ALPHA _ PERCENT Ġ= Ġ 5 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ SH ADOW _ CLIP _ TO _ P ADDING Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ DOWN SCALE _ RATE Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMIN _ BL UR _ RADIUS Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ BL UR _ RADIUS Ġ= Ġ 2 5 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠAL PH A _ OP A QUE _ INT Ġ= Ġ 2 5 5 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġshadow Bitmap : ĠBitmap ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġshadow Paint : ĠPaint Ġ= ĠPaint ( Paint . ANTI _ ALIAS _ FLAG ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġis D ither Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġis Filter Bitmap Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġshadow Top Offset : ĠInt Ġ= ĠDEFAULT _ OFFSET ĊĠĠĠ Ġprivate Ġvar Ġshadow Right Offset : ĠInt Ġ= ĠDEFAULT _ OFFSET ĊĠĠĠ Ġprivate Ġvar Ġshadow Left Offset : ĠInt Ġ= ĠDEFAULT _ OFFSET ĊĠĠĠ Ġprivate Ġvar Ġshadow Blur Radius : ĠInt Ġ= ĠDEFAULT _ RADIUS ĊĠĠĠ Ġprivate Ġvar Ġshadow Cli pped To Padding : ĠBoolean Ġ= ĠDEFAULT _ SH ADOW _ CLIP _ TO _ P ADDING ĊĠĠĠ Ġprivate Ġvar Ġis Async : ĠBoolean Ġ= ĠDEFAULT _ IS _ ASYNC ĊĊĠĠĠ Ġprivate Ġvar Ġshadow Creation Disposable Ġ= ĠDis pos ables . dis posed () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEnable Ġor Ġdisable Ġdrawing Ġof Ġshadow . ĊĠĠĠĠ Ġ* ĠUse Ġcase : Ġsome time Ġwhen Ġview Ġis Ġdisabled Ġyou Ġdon 't Ġneed Ġto Ġdraw Ġshadow . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġshould Draw Shadow : ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġredraw Shadow () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠShadow Ġalpha Ġin Ġpercent s . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġshadow Alpha Percent : ĠInt Ġ= ĠDEFAULT _ ALPHA _ PERCENT ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Paint . alpha Ġ= Ġ( value Ġ/ Ġ 1 0 0 f Ġ* ĠAL PH A _ OP A QUE _ INT ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠColor Ġof Ġthe Ġshadow . ĊĠĠĠĠ Ġ* ĠUse Ġcase : Ġsometimes Ġyou Ġwant Ġdraw Ġshadow Ġof Ġthe Ġwhite Ġbackground Ġview . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Color Int ĊĠĠĠ Ġvar Ġshadow Color : ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Paint . color Filter Ġ= Ġshadow Color ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPort er D uff Color Filter ( it , ĠPort er D uff . Mode . SRC _ IN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġobtain Attrs ( context , Ġattrs ) ĊĠĠĠĠĠĠĠ Ġinit View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobtain Attrs ( context : ĠContext , Ġattrs : ĠAttributeSet ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtyped Array Ġ= Ġcontext . obtain Styled Attributes ( attrs , ĠR . style able . Shadow Layout ) ĊĊĠĠĠĠĠĠĠ Ġis Async Ġ= Ġtyped Array . getBoolean ( R . style able . Shadow Layout _ is Async , ĠDEFAULT _ IS _ ASYNC ) ĊĠĠĠĠĠĠĠ Ġshadow Cli pped To Padding Ġ= Ġtyped Array . getBoolean ( R . style able . Shadow Layout _ shadow Cli pped To Padding , ĠDEFAULT _ SH ADOW _ CLIP _ TO _ P ADDING ) ĊĠĠĠĠĠĠĠ Ġshadow Blur Radius Ġ= Ġtyped Array . get Dimension Pixel Size ( R . style able . Shadow Layout _ shadow Radius , ĠDEFAULT _ RADIUS ) ĊĠĠĠĠĠĠĠ Ġshadow Left Offset Ġ= Ġtyped Array . get Dimension Pixel Offset ( R . style able . Shadow Layout _ shadow Left Offset , ĠDEFAULT _ OFFSET ) ĊĠĠĠĠĠĠĠ Ġshadow Right Offset Ġ= Ġtyped Array . get Dimension Pixel Offset ( R . style able . Shadow Layout _ shadow Right Offset , ĠDEFAULT _ OFFSET ) ĊĠĠĠĠĠĠĠ Ġshadow Top Offset Ġ= Ġtyped Array . get Dimension Pixel Offset ( R . style able . Shadow Layout _ shadow Top Offset , ĠDEFAULT _ OFFSET ) ĊĠĠĠĠĠĠĠ Ġshadow Alpha Percent Ġ= Ġtyped Array . getInteger ( R . style able . Shadow Layout _ shadow Alpha Percent , ĠDEFAULT _ ALPHA _ PERCENT ) ĊĠĠĠĠĠĠĠ Ġif Ġ( typed Array . hasValue ( R . style able . Shadow Layout _ shadow Color )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Color Ġ= Ġtyped Array . getColor ( R . style able . Shadow Layout _ shadow Color , ĠColor . TRANSP ARENT ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtyped Array . recycle () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit View () Ġ{ ĊĠĠĠĠĠĠĠ Ġclip To Padding Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġclip Children Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ(! shadow Cli pped To Padding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Padding () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detached From Window () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Detached From Window () ĊĠĠĠĠĠĠĠ Ġclear Shadow Bitmap () ĊĠĠĠĠĠĠĠ Ġif Ġ( is Async ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Creation Disposable . dispose () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispatch Draw ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( should Draw Shadow Ġ&& Ġshadow Bitmap Ġ== Ġnull Ġ&& Ġwidth Ġ> Ġ 0 Ġ&& Ġheight Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Bitmap Ġ= ĠBitmap . create Bitmap ( width , Ġheight , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Canvas Ġ= ĠCanvas ( source Bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground ?. draw ( source Canvas ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . dispatch Draw ( source Canvas ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Async Ġ-> Ġsubscribe To Shadow Creation ( source Bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġshadow Bitmap Ġ= Ġcreate Shadow Bitmap ( source Bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġshadow Bitmap ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas ?. draw Bitmap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- shadow Blur Radius . toFloat () Ġ+ Ġshadow Left Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- shadow Blur Radius . toFloat () Ġ+ Ġshadow Top Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Paint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuper . dispatch Draw ( canvas ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRed raw ing Ġof Ġthe Ġshadow Ġ( clear ing Ġthe Ġshadow Ġbitmap , Ġre creating Ġand Ġredraw ing Ġit ). ĊĠĠĠĠ Ġ* ĠCould Ġbe Ġuseful Ġwhen Ġthe Ġcontent Ġof Ġthe Ġchild Ġview Ġchanges . ĊĠĠĠĠ Ġ* ĠFor Ġexample Ġafter Ġre binding Ġof Ġthe ĠRecyclerView 's Ġitem . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġredraw Shadow () Ġ{ ĊĠĠĠĠĠĠĠ Ġclear Shadow Bitmap () ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsubscribe To Shadow Creation ( source Bitmap : ĠBitmap ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshadow Creation Disposable . dispose () ĊĠĠĠĠĠĠĠ Ġshadow Creation Disposable Ġ= ĠSingle . from Callable Ġ{ Ġcreate Shadow Bitmap ( source Bitmap ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġbitmap : ĠBitmap ?, Ġerror : ĠThrowable ? Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ!= Ġnull Ġ-> ĠLogger . e ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Bitmap Ġ= Ġbitmap ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Shadow Bitmap ( source Bitmap : ĠBitmap ): ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġradius Ġ= Ġsafe Create Blur Radius ( DEFAULT _ DOWN SCALE _ RATE ) ĊĠĠĠĠĠĠĠ Ġval Ġdown scale Padding Ġ= Ġ( shadow Blur Radius Ġ/ ĠDEFAULT _ DOWN SCALE _ RATE ) ĊĠĠĠĠĠĠĠ Ġval Ġdown scaled Bitmap Ġ= ĠBitmap . create Scaled Bitmap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Bitmap , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( source Bitmap . width Ġ- Ġshadow Left Offset Ġ- Ġshadow Right Offset ) Ġ/ ĠDEFAULT _ DOWN SCALE _ RATE ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( source Bitmap . height Ġ/ ĠDEFAULT _ DOWN SCALE _ RATE ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbl urred Bitmap Ġ= Ġcreate Bl urred Bitmap ( down scaled Bitmap , Ġdown scale Padding , Ġradius ) ĊĊĠĠĠĠĠĠĠ Ġval Ġshadow Width Ġ= Ġwidth Ġ+ Ġshadow Blur Radius Ġ* Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġwidth Scale : ĠFloat Ġ= Ġ( shadow Width Ġ- Ġshadow Left Offset Ġ- Ġshadow Right Offset ) Ġ/ Ġshadow Width . toFloat () ĊĊĠĠĠĠĠĠĠ Ġval Ġshadow Height Ġ= Ġheight Ġ+ Ġshadow Blur Radius Ġ* Ġ 2 ĊĠĠĠĠĠĠĠ Ġreturn ĠBitmap . create Scaled Bitmap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbl urred Bitmap , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( shadow Width Ġ* Ġwidth Scale ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Bl urred Bitmap ( bitmap : ĠBitmap , Ġpadding : ĠInt , Ġradius : ĠInt ): ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠBl ur Util . render Script Blur ( context , Ġbitmap . set Padding ( padding ), Ġradius ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Padding () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġpadding Ġfor Ġshadow Ġbitmap ĊĠĠĠĠĠĠĠ Ġ// Ġint Ġleft , Ġint Ġtop , Ġint Ġright , Ġint Ġbottom ĊĠĠĠĠĠĠĠ Ġset Padding ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Left Ġ+ Ġshadow Blur Radius Ġ- Ġshadow Left Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Top Ġ+ Ġshadow Blur Radius Ġ- Ġshadow Top Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Right Ġ+ Ġshadow Blur Radius Ġ- Ġshadow Right Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Bottom Ġ+ Ġshadow Blur Radius Ġ+ Ġshadow Top Offset ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Same Parameter Value ") ĊĠĠĠ Ġprivate Ġfun Ġsafe Create Blur Radius ( down scale Rate : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdesired Radius Ġ= Ġshadow Blur Radius Ġ/ Ġdown scale Rate ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdesired Radius Ġ< ĠMIN _ BL UR _ RADIUS Ġ-> ĠMIN _ BL UR _ RADIUS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdesired Radius Ġ> ĠMAX _ BL UR _ RADIUS Ġ-> ĠMAX _ BL UR _ RADIUS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġdesired Radius ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear Shadow Bitmap () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( shadow Bitmap Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Bitmap ?. recycle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Bitmap Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }