package Ġcom . sin ase y fi . advanced card view sample Ċ Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . util . Typed Value Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġkotlinx . android . synt hetic . main . activity _ a _ hole _ in _ your _ screen .* Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . asin Ċ import Ġkotlin . math . sqrt Ċ Ċ class ĠA Hole In Your Screen Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġmax Shadow Distance Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġcenter X Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġcenter Y Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġx Ġ= Ġcenter X ĊĠĠĠ Ġprivate Ġvar Ġy Ġ= Ġcenter Y ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġmax Shadow Distance Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTyped Value . apply Dimension ( Typed Value . COMPLEX _ UNIT _ DIP , Ġ 4 f , Ġthis . resources . display Metrics ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toInt () ĊĠĠĠĠĠĠĠ Ġcenter X Ġ= Ġthis . resources . display Metrics . width Pixels Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġcenter Y Ġ= Ġthis . resources . display Metrics . height Pixels Ġ/ Ġ 2 ĊĊĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ a _ hole _ in _ your _ screen ) ĊĠĠĠĠĠĠĠ Ġhole _ screen . setOn Touch Listener ( on Screen Tou ched ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Shadow Distance ( x : ĠInt , Ġy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdiameter Ġ= Ġsqrt ( Math . pow ( center X . toDouble (), Ġ 2 . toDouble ()) Ġ+ ĠMath . pow ( center Y . toDouble (), Ġ 2 . toDouble ())). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġhalf Di ameter Ġ= Ġdiameter Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġdistance From Center Ġ= Ġsqrt ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMath . pow ( x Ġ- Ġcenter X . toDouble (), Ġ 2 . toDouble ()) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMath . pow ( y Ġ- Ġcenter Y . toDouble (), Ġ 2 . toDouble ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġshadow Distance Ġ= Ġ( distance From Center Ġ/ Ġhalf Di ameter Ġ* Ġmax Shadow Distance ). toFloat () ĊĠĠĠĠĠĠĠ Ġvar Ġangle Ġ= ĠMath . to Degrees ( asin ( Ġabs ( x Ġ- Ġcenter X ) Ġ/ Ġdistance From Center )) ĊĠĠĠĠĠĠĠ Ġif ( x Ġ== Ġcenter X Ġ&& Ġy Ġ== Ġcenter Y ) Ġangle Ġ= Ġ 0 . toDouble () ĊĠĠĠĠĠĠĠ Ġelse Ġif ( x Ġ>= Ġcenter X Ġ&& Ġy Ġ>= Ġcenter Y ) Ġangle Ġ= Ġ 1 8 0 Ġ- Ġangle ĊĠĠĠĠĠĠĠ Ġelse Ġif ( x Ġ<= Ġcenter X Ġ&& Ġy Ġ<= Ġcenter Y ) Ġangle Ġ*= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġelse Ġif ( x Ġ<= Ġcenter X Ġ&& Ġy Ġ>= Ġcenter Y ) Ġangle Ġ+= Ġ 1 8 0 ĊĠĠĠĠĠĠĠ Ġhole . set Shadow Inner Distance ( 0 , Ġshadow Distance ) ĊĠĠĠĠĠĠĠ Ġhole . set Shadow Inner Angle ( 0 , Ġangle . toFloat ()) ĊĠĠĠĠĠĠĠ Ġhole . invalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġon Screen Tou ched Ġ= Ġobject : ĠView . On Touch Listener Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Touch ( v : ĠView ?, Ġevent : ĠMotion Event ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it . action Ġ== ĠMotion Event . ACTION _ DOWN Ġ|| Ġit . action Ġ== ĠMotion Event . ACTION _ MOVE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġit . getX ( 0 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġit . getY ( 0 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Shadow Distance ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif ( it . action Ġ== ĠMotion Event . ACTION _ UP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġcenter X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġcenter Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Shadow Distance ( x , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ } Ċ