package Ġcom . str as z . iris . view Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . graphics . Path Ċ import Ġandroid . graphics . Port er D uff Ċ import Ġandroid . graphics . Port er D uff X fer mode Ċ import Ġandroid . graphics . Rect F Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Typed Value Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View Tree Observer Ċ import Ġandroidx . core . content . res . Resources Compat Ċ import Ġandroidx . core . view . margin Bottom Ċ import Ġandroidx . core . view . margin Right Ċ import Ġcom . str as z . iris . R Ċ Ċ / ******************************************************** ****** Ċ Ġ*** ĠĠĠĠĠĠĠ ĠOrigin ally Ġwritten Ġby ĠO liver ĠStr as zyn ski ĠĠĠĠĠĠĠ Ġ*** Ċ Ġ*** ĠĠĠĠĠĠĠ Ġhttps :// github . com / bro liver 1 2 / ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*** Ċ Ġ*** ĠĠĠĠĠĠĠ ĠSubject Ġto ĠMIT ĠLicense Ġ( c ) Ġ 2 0 2 1 ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*** Ċ Ġ********************************************************* *****/ Ċ Ċ class ĠCor ner Overlay View ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull Ċ ) Ġ: ĠView ( context , Ġattrs ) Ġ{ ĊĊĠĠĠ Ġ// ĠCreate Ġ[ Paint ] Ġobjects ĊĠĠĠ Ġprivate Ġval Ġclear Paint Ġ= ĠPaint () ĊĠĠĠ Ġprivate Ġval Ġborder Paint Ġ= ĠPaint () ĊĊĠĠĠ Ġprivate Ġvar ĠborderWidth Dp : ĠFloat Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġinner Corner Radius Px : ĠFloat Ġ= Ġdp To Px ( 2 4 f ) ĊĠĠĠ Ġprivate Ġvar Ġouter Corner Radius Px : ĠFloat Ġ= Ġdp To Px ( 2 4 f ) ĊĊĠĠĠ Ġprivate Ġval Ġclip Path Ġ= ĠPath () ĊĊĠĠĠ Ġprivate Ġvar Ġouter Rect F : ĠRect F ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġinner Rect F : ĠRect F ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġparse Xml Attributes ( attrs ) ĊĠĠĠĠĠĠĠ Ġset Will Not Draw ( false ) ĊĠĠĠĠĠĠĠ Ġset Layer Type ( LAYER _ TYPE _ HARD WARE , Ġnull ) ĊĠĠĠĠĠĠĠ Ġclip Path . fill Type Ġ= ĠPath . Fill Type . W IND ING ĊĠĠĠĠĠĠĠ Ġclear Paint . xfer mode Ġ= ĠPort er D uff X fer mode ( Port er D uff . Mode . CLEAR ) ĊĠĠĠĠĠĠĠ Ġview Tree Observer . add On Global Layout Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠView Tree Observer . On Global Layout Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Global Layout () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view Tree Observer . is Alive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġouter Rect F Ġ= ĠRect F ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright . toFloat () Ġ- ĠmarginRight , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom . toFloat () Ġ- ĠmarginBottom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Rect F Ġ= ĠRect F ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft . toFloat () Ġ+ Ġdp To Px ( border Width Dp ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop . toFloat () Ġ+ Ġdp To Px ( border Width Dp ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright . toFloat () Ġ- ĠmarginRight Ġ- Ġdp To Px ( border Width Dp ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom . toFloat () Ġ- ĠmarginBottom Ġ- Ġdp To Px ( border Width Dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Tree Observer . remove On Global Layout Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġ// ĠDraw ĠBorder ĊĠĠĠĠĠĠĠ Ġouter Rect F ?. let Ġ{ Ġrect Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas ?. draw Round Rect ( rect , Ġouter Corner Radius Px , Ġouter Corner Radius Px , Ġborder Paint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠDraw ĠH ole ĊĠĠĠĠĠĠĠ Ġinner Rect F ?. let Ġ{ Ġrect Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas ?. draw Round Rect ( rect , Ġinner Corner Radius Px , Ġinner Corner Radius Px , Ġclear Paint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdp To Px ( dp : ĠFloat ) Ġ= ĠTyped Value . apply Dimension ( ĊĠĠĠĠĠĠĠ ĠTyped Value . COMPLEX _ UNIT _ DIP , ĊĠĠĠĠĠĠĠ Ġdp , ĊĠĠĠĠĠĠĠ Ġresources . display Metrics ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠParse ĠXML Ġattributes Ġand Ġinitialize Ġlocal Ġvariables Ġto Ġprovided Ġ( or Ġdefault ) Ġvalues ĊĠĠĠ Ġprivate Ġfun Ġparse Xml Attributes ( attrs : ĠAttributeSet ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Look Ġfor Ġattributes Ġdeclared Ġin ĠXML ĊĠĠĠĠĠĠĠ Ġcontext . theme . obtain Styled Attributes ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattrs , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Corner Overlay View , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 0 ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġxml Arg Border Width Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Int ( R . style able . Corner Overlay View _ border Width , Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġxml Arg BorderColor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Int ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Corner Overlay View _ border Color , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResources Compat . getColor ( resources , ĠR . color . black , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġxml Arg Border Radius Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Int ( R . style able . Corner Overlay View _ outer Corner Radius , Ġ 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠborderWidth Dp Ġ= Ġxml Arg Border Width . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġouter Corner Radius Px Ġ= Ġdp To Px ( xml Arg Border Radius . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner Corner Radius Px Ġ= Ġdp To Px ( xml Arg Border Radius . toFloat () Ġ- ĠborderWidth Dp Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġborder Paint . color Ġ= Ġxml Arg BorderColor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cycle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }