package Ġcom . rom 4 ek . cur ven av view Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics .* Ċ import Ġandroid . graphics . drawable . Color Drawable Ċ import Ġandroid . os . Build Ċ import Ġandroid . support . annotation . Requires Api Ċ import Ġandroid . support . design . internal . Navigation Menu View Ċ import Ġandroid . support . design . internal . S cri m Insets Frame Layout Ċ import Ġandroid . support . design . widget . Navigation View Ċ import Ġandroid . support . v 4 . view . View Compat Ċ import Ġandroid . support . v 4 . widget . Drawer Layout Ċ import Ġandroid . text . TextUtils Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Gravity Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . View Outline Provider Ċ import Ġandroid . widget . TextView ĊĊ Ċ /** Ċ Ġ* ĠCreated Ġby Ġrom 4 ek Ġon Ġ 1 0 . 0 1 . 2 0 1 7 . Ċ Ġ*/ Ċ Ċ class ĠCurve Nav View Ġ: ĠNavigation View Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġsettings : ĠCurve View Settings ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Height Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Width Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġclip Path : ĠPath ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġarc Path : ĠPath ? Ġ= Ġnull ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġsuper ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( context , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: Ġsuper ( context , Ġattrs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( context , Ġattrs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinit ( context : ĠContext , Ġattrs : ĠAttributeSet ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsettings Ġ= ĠCurve View Settings ( context , Ġattrs ) ĊĠĠĠĠĠĠĠ Ġsettings !!. elevation Ġ= ĠView Compat . get Elevation ( this ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġhardware Ġacceleration Ġis Ġon Ġ( default Ġfrom ĠAPI Ġ 1 4 ), Ġclip Path Ġworked Ġcorrectly ĊĠĠĠĠĠĠĠĠ Ġ* Ġfrom ĠAPI Ġ 1 8 . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠSo Ġwe Ġwill Ġdisable Ġhardware ĠAccel eration Ġif ĠAPI Ġ< Ġ 1 8 ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġhttps :// developer . android . com / guide / topics / graphics / hardware - accel . html # unsupported ĊĠĠĠĠĠĠĠĠ Ġ* ĠSection Ġ# Unsupported ĠDraw ing ĠOperations ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠ Ġset Layer Type ( View . LAYER _ TYPE _ SOFTWARE , Ġnull ) ĊĠĠĠĠĠĠĠ Ġset BackgroundColor ( Color . TRANSP ARENT ) ĊĠĠĠĠĠĠĠ Ġset Insets Color ( Color . TRANSP ARENT ) ĊĠĠĠĠĠĠĠ ĠTH RESH OLD Ġ= ĠMath . round ( Curve View Settings . dp To Px ( getContext (), Ġ 1 5 )) Ġ// some Ġthreshold Ġfor Ġchild Ġviews Ġwhile Ġre meas uring Ġthem ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Insets Color ( color : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinset Foreground Field Ġ= ĠS cri m Insets Frame Layout :: class . java . getDeclared Field (" m Inset Foreground ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinset Foreground Field . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Drawable Ġ= ĠColor Drawable ( color ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinset Foreground Field . set ( this , Ġcolor Drawable ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch Field Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" R tl Hard coded ") ĊĠĠĠ Ġprivate Ġfun Ġcreate Clip Path (): ĠPath Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠPath () ĊĠĠĠĠĠĠĠ Ġarc Path Ġ= ĠPath () ĊĊĠĠĠĠĠĠĠ Ġval Ġarc Width Ġ= Ġsettings !!. arc Width ĊĠĠĠĠĠĠĠ Ġval Ġlayout Params Ġ= Ġlayout Params Ġas ĠDraw er Layout . LayoutParams ĊĠĠĠĠĠĠĠ Ġif Ġ( settings !!. is Crop Inside ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( layout Params . gravity Ġ== ĠGr avity . START Ġ|| Ġlayout Params . gravity Ġ== ĠGr avity . LEFT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarc Path !!. moveTo ( m Width . toFloat (), Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarc Path !!. quad To ( m Width Ġ- Ġarc Width , Ġ( m Height Ġ/ Ġ 2 ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Width . toFloat (), Ġm Height . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarc Path !!. close () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . moveTo ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( m Width . toFloat (), Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . quad To ( m Width Ġ- Ġarc Width , Ġ( m Height Ġ/ Ġ 2 ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Width . toFloat (), Ġm Height . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( 0 f , Ġm Height . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( layout Params . gravity Ġ== ĠGr avity . END Ġ|| Ġlayout Params . gravity Ġ== ĠGr avity . RIGHT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarc Path !!. moveTo ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarc Path !!. quad To ( arc Width , Ġ( m Height Ġ/ Ġ 2 ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , Ġm Height . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarc Path !!. close () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . moveTo ( m Width . toFloat (), Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . quad To ( arc Width , Ġ( m Height Ġ/ Ġ 2 ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , Ġm Height . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( m Width . toFloat (), Ġm Height . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( layout Params . gravity Ġ== ĠGr avity . START Ġ|| Ġlayout Params . gravity Ġ== ĠGr avity . LEFT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarc Path !!. moveTo ( m Width Ġ- Ġarc Width Ġ/ Ġ 2 , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarc Path !!. quad To ( m Width Ġ+ Ġarc Width Ġ/ Ġ 2 , Ġ( m Height Ġ/ Ġ 2 ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Width Ġ- Ġarc Width Ġ/ Ġ 2 , Ġm Height . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarc Path !!. close () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . moveTo ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( m Width Ġ- Ġarc Width Ġ/ Ġ 2 , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . quad To ( m Width Ġ+ Ġarc Width Ġ/ Ġ 2 , Ġ( m Height Ġ/ Ġ 2 ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Width Ġ- Ġarc Width Ġ/ Ġ 2 , Ġm Height . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( 0 f , Ġm Height . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( layout Params . gravity Ġ== ĠGr avity . END Ġ|| Ġlayout Params . gravity Ġ== ĠGr avity . RIGHT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarc Path !!. moveTo ( arc Width Ġ/ Ġ 2 , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarc Path !!. quad To (- arc Width Ġ/ Ġ 2 , Ġ( m Height Ġ/ Ġ 2 ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarc Width Ġ/ Ġ 2 , Ġm Height . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarc Path !!. close () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . moveTo ( m Width . toFloat (), Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( arc Width Ġ/ Ġ 2 , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . quad To (- arc Width Ġ/ Ġ 2 , Ġ( m Height Ġ/ Ġ 2 ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarc Width Ġ/ Ġ 2 , Ġm Height . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . lineTo ( m Width . toFloat (), Ġm Height . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpath ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Layout ( changed : ĠBoolean , Ġleft : ĠInt , Ġtop : ĠInt , Ġright : ĠInt , Ġbottom : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Layout ( changed , Ġleft , Ġtop , Ġright , Ġbottom ) ĊĠĠĠĠĠĠĠ Ġif Ġ( changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate Layout And Children () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset Font ( settings ?. font Asset Src ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Font ( font Src : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsettings ?. font Asset Src Ġ= Ġfont Src ĊĠĠĠĠĠĠĠ Ġif Ġ( font Src Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Fonts ( context , Ġthis , Ġfont Src ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġoverride Fonts ( context : ĠContext , Ġv : ĠView , Ġfont Src : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype face Ġ= ĠType face . createFrom Asset ( context . assets , Ġfont Src ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v Ġis ĠViewGroup ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġv . child Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġv . getChild At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Fonts ( context , Ġchild , Ġfont Src ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( v Ġis ĠTextView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . type face Ġ= Ġtype face ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġmeasure Child ( child : ĠView , Ġparent Width Measure Spec : ĠInt , Ġparent Height Measure Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( child Ġis ĠNavigation Menu View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild . measure ( Measure Spec . make Measure Spec ( meas ured Width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMeasure Spec . EX ACT LY ), ĠMeasure Spec . make Measure Spec ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeasured Height , ĠMeasure Spec . EX ACT LY )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . measure Child ( child , Ġparent Width Measure Spec , Ġparent Height Measure Spec ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Layout And Children () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( settings Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Height Ġ= Ġmeasured Height ĊĠĠĠĠĠĠĠ Ġm Width Ġ= Ġmeasured Width ĊĠĠĠĠĠĠĠ Ġif Ġ( m Width Ġ> Ġ 0 Ġ&& Ġm Height Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclip Path Ġ= Ġcreate Clip Path () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠView Compat . set Elevation ( this , Ġsettings !!. elevation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . LO L LI POP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutline Provider Ġ= Ġobject Ġ: ĠView Outline Provider () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Requires Api ( api Ġ= ĠBuild . VERSION _ CODES . LO L LI POP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Outline ( view : ĠView , Ġoutline : ĠOut line ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( clip Path !!. is Convex ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutline . set Convex Path ( clip Path !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġchild Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġcount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġget Child At ( i ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v Ġis ĠNavigation Menu View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . setBackground ( settings !!. background Drawable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView Compat . set Elevation ( v , Ġsettings !!. elevation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : Ġadjust ing Ġchild Ġviews Ġto Ġnew Ġm Width Ġin Ġtheir Ġright most / left most Ġpoints Ġrelated Ġto Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Child Views (( ViewGroup ) Ġv ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" R tl Hard coded ") ĊĠĠĠ Ġprivate Ġfun Ġadjust Child Views ( container : ĠViewGroup ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontainer Child Count Ġ= Ġcontainer . child Count ĊĠĠĠĠĠĠĠ Ġval Ġpath Measure Ġ= ĠPath Measure ( arc Path , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġlayout Params Ġ= Ġlayout Params Ġas ĠDraw er Layout . LayoutParams ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġcontainer Child Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġcontainer . getChild At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Ġis ĠViewGroup ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Child Views ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Center Point For Item Ġ= Ġfloat ArrayOf ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġlocate View ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhalf Height Ġ= Ġlocation . height () Ġ/ Ġ 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Measure . get Pos Tan (( location . top Ġ+ Ġhalf Height ). toFloat (), Ġpath Center Point For Item , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( layout Params . gravity Ġ== ĠGr avity . END Ġ|| Ġlayout Params . gravity Ġ== ĠGr avity . RIGHT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcenter Path Point Ġ= Ġmeasured Width Ġ- ĠMath . round ( path Center Point For Item [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child . meas ured Width Ġ> Ġcenter Path Point ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . measure ( Measure Spec . make Measure Spec ( center Path Point Ġ- ĠTH RESH OLD , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMeasure Spec . EX ACT LY ), ĠMeasure Spec . make Measure Spec ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . meas ured Height , ĠMeasure Spec . EX ACT LY )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . layout ( center Path Point Ġ+ ĠTH RESH OLD , Ġchild . top , Ġchild . right , Ġchild . bottom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( layout Params . gravity Ġ== ĠGr avity . START Ġ|| Ġlayout Params . gravity Ġ== ĠGr avity . LEFT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child . meas ured Width Ġ> Ġpath Center Point For Item [ 0 ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . measure ( Measure Spec . make Measure Spec ( Math . round ( path Center Point For Item [ 0 ]) Ġ- ĠTH RESH OLD , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMeasure Spec . EX ACT LY ), ĠMeasure Spec . make Measure Spec ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . meas ured Height , ĠMeasure Spec . EX ACT LY )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . layout ( child . left , Ġchild . top , ĠMath . round ( path Center Point For Item [ 0 ]) Ġ- ĠTH RESH OLD , Ġchild . bottom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// set Ġtext Ġel lip size Ġto Ġend Ġto Ġprevent Ġit Ġfrom Ġoverlapping Ġedge ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Ġis ĠTextView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . el lip size Ġ= ĠText Utils . Truncate At . END ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlocate View ( view : ĠView ?): ĠRect Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġloc Ġ= ĠRect () ĊĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= ĠInt Array ( 2 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( view Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġloc ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġview . getLocation On Screen ( location ) ĊĊĠĠĠĠĠĠĠ Ġloc . left Ġ= Ġlocation [ 0 ] ĊĠĠĠĠĠĠĠ Ġloc . top Ġ= Ġlocation [ 1 ] ĊĠĠĠĠĠĠĠ Ġloc . right Ġ= Ġloc . left Ġ+ Ġview . width ĊĠĠĠĠĠĠĠ Ġloc . bottom Ġ= Ġloc . top Ġ+ Ġview . height ĊĠĠĠĠĠĠĠ Ġreturn Ġloc ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispatch Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcanvas . save () ĊĊĠĠĠĠĠĠĠ Ġcanvas . clip Path ( clip Path !! ) ĊĠĠĠĠĠĠĠ Ġsuper . dispatch Draw ( canvas ) ĊĊĠĠĠĠĠĠĠ Ġcanvas . restore () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠTH RESH OLD : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ} Ċ } Ċ