/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠN az mul ĠI dr is . ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* Ġ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 Ġengineering . ux d . example . custom views Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġkotlinx . android . synt hetic . main . activity _ custom _ view _ group . view .* Ċ import Ġorg . jetbrains . ank o . An ko Logger Ċ Ċ class ĠCustom ViewGroup Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ custom _ view _ group ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠSimple ListItem Ġ@ Jvm Over loads Ġconstructor ( context : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdef Style Attr : ĠInt Ġ= Ġ 0 ) Ġ: ĊĠĠĠĠĠĠĠ ĠViewGroup ( context , Ġattrs , Ġdef Style Attr ), ĊĠĠĠĠĠĠĠ ĠAn ko Logger Ġ{ ĊĊĠĠĠ Ġ// ĠMake Ġsure Ġto Ġuse ĠMargin LayoutParams Ġ( to Ġensure Ġthat Ġany Ġchild Ġviews Ġthat Ġare Ġadded ĊĠĠĠ Ġ// Ġto Ġthis ĠViewGroup Ġcan Ġhave Ġmargins ). ĊĊĠĠĠ Ġoverride Ġfun Ġcheck LayoutParams ( p : ĠLayout Params ) Ġ= Ġp Ġis ĠMargin LayoutParams ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate Default LayoutParams () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . Margin LayoutParams ( LayoutParams . WRAP _ CONTENT , ĠLayout Params . WRAP _ CONTENT ) ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate LayoutParams ( attrs : ĠAttributeSet ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . Margin LayoutParams ( context , Ġattrs ) ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate LayoutParams ( p : ĠLayout Params ) Ġ= ĠViewGroup . Margin LayoutParams ( p ) ĊĊĠĠĠ Ġ// ĠMeasure . ĊĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width MS : ĠInt , Ġheight MS : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠActually Ġdo Ġthe Ġmeasurement . ĊĠĠĠĠĠĠĠ Ġperform Measurement Of Children ( width MS , Ġheight MS ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠFind Ġout Ġhow Ġmuch Ġspace Ġthe Ġicon Ġused Ġ( including Ġmargins ). ĊĠĠĠĠĠĠĠ Ġval Ġicon Width Ġ= Ġicon . width Used () ĊĠĠĠĠĠĠĠ Ġval Ġicon Height Ġ= Ġicon . height Used () ĊĊĠĠĠĠĠĠĠ Ġ// ĠFind Ġout Ġhow Ġmuch Ġspace Ġthe Ġtitle Ġused Ġ( including Ġmargins ). ĊĠĠĠĠĠĠĠ Ġval Ġtitle Width Ġ= Ġtitle . width Used () ĊĠĠĠĠĠĠĠ Ġval Ġtitle Height Ġ= Ġtitle . height Used () ĊĊĠĠĠĠĠĠĠ Ġ// ĠFind Ġout Ġhow Ġmuch Ġspace Ġthe Ġsubtitle Ġused Ġ( including Ġmargins ). ĊĠĠĠĠĠĠĠ Ġval Ġsubtitle Width Ġ= Ġsubtitle . width Used () ĊĠĠĠĠĠĠĠ Ġval Ġsubtitle Height Ġ= Ġsubtitle . height Used () ĊĊĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġwidth Ġtaken Ġup Ġby Ġthe Ġchildren Ġand Ġown Ġpadding . ĠThe ĠViewGroup ĊĠĠĠĠĠĠĠ Ġ// Ġis Ġbe having Ġas Ġa ĠView Ġin Ġthis Ġcase Ġand Ġhas Ġto Ġdeal Ġw / Ġit 's Ġown Ġpadding . ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġpadding Left Ġ+ Ġpadding Right Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Width Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMath . max ( title Width , Ġsubtitle Width ) ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġpadding Top Ġ+ Ġpadding Bottom Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMath . max ( icon Height , Ġtitle Height Ġ+ Ġsubtitle Height ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRe concile Ġthe Ġmeasured Ġdimensions Ġw / Ġthis Ġview 's Ġconstraints Ġand Ġset Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġfinal Ġmeasured Ġwidth Ġand Ġheight Ġfor Ġthe Ġcomposite ĠViewGroup . ĊĠĠĠĠĠĠĠ Ġset Measured Dimension ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Size ( width , Ġwidth MS ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Size ( height , Ġheight MS ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġperform Measurement Of Children ( width MS : ĠInt , Ġheight MS : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠMeasure Ġicon . ĊĠĠĠĠĠĠĠ Ġmeasure Child With Margins ( icon , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth MS , Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight MS , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠMeasure Ġtitle Ġ( by Ġmaking Ġsure Ġto Ġtake Ġthe Ġicon 's Ġmargins Ġinto Ġaccount ). ĊĠĠĠĠĠĠĠ Ġmeasure Child With Margins ( title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth MS , Ġicon . width Used (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight MS , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠMeasure Ġsubtitle Ġ( by Ġmaking Ġsure Ġto Ġtake Ġthe Ġicon 's Ġand Ġtitle 's Ġmargins Ġinto Ġaccount ). ĊĠĠĠĠĠĠĠ Ġmeasure Child With Margins ( subtitle , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth MS , Ġicon . width Used (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight MS , Ġtitle . height Used ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠIncludes Ġmargin Ġand Ġpadding . Ġ[ get Measured Width ] Ġonly Ġincludes Ġpadding Ġfor Ġthe Ġ[ View ] Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠView . width Used (): ĠInt Ġ= Ġmeasured Width Ġ+ ĠmarginLeft () Ġ+ ĠmarginRight () ĊĊĠĠĠ Ġ/** ĠIncludes Ġmargin Ġand Ġpadding . Ġ[ get Measured Height ] Ġonly Ġincludes Ġpadding Ġfor Ġthe Ġ[ View ] Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠView . height Used (): ĠInt Ġ= Ġmeasured Height Ġ+ ĠmarginTop () Ġ+ ĠmarginBottom () ĊĊĠĠĠ Ġ/** ĠThe Ġchildren Ġof Ġthis Ġ[ ViewGroup ] Ġcan Ġhave Ġmargins , Ġsince Ġ[ check LayoutParams ], ĊĠĠĠĠ Ġ* Ġ[ generate Default LayoutParams ], Ġ[ generate LayoutParams ], Ġwere Ġoverridden Ġin Ġorder Ġto ĊĠĠĠĠ Ġ* Ġsupport Ġchildren Ġhaving Ġmargins .*/ ĊĠĠĠ Ġprivate Ġfun ĠView . margin LayoutParams (): ĠMargin LayoutParams Ġ= Ġlayout Params Ġas ĠMargin LayoutParams ĊĊĠĠĠ Ġprivate Ġfun ĠView . margin Left (): ĠInt Ġ= Ġmargin LayoutParams (). left Margin ĊĠĠĠ Ġprivate Ġfun ĠView . margin Right (): ĠInt Ġ= Ġmargin LayoutParams (). right Margin ĊĠĠĠ Ġprivate Ġfun ĠView . margin Top (): ĠInt Ġ= Ġmargin LayoutParams (). top Margin ĊĠĠĠ Ġprivate Ġfun ĠView . margin Bottom (): ĠInt Ġ= Ġmargin LayoutParams (). bottom Margin ĊĊĠĠĠ Ġ// ĠLayout . ĊĊĠĠĠ Ġval Ġcoord Ġ= ĠXY Coord () ĊĊĠĠĠ Ġdata Ġclass ĠXY Coord ( var Ġx : ĠInt Ġ= Ġ 0 , Ġvar Ġy : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġ[ View . get Measured Width ] Ġdoes Ġnot Ġinclude Ġmargins Ġ( but Ġdoes Ġinclude Ġpadding ). ĊĠĠĠĠ Ġ* ĠThis Ġis Ġwhy Ġthe Ġ[ margin Left ], Ġ[ margin Right ], Ġ[ margin Top ], Ġand Ġ[ margin Bottom ] Ġextension ĊĠĠĠĠ Ġ* Ġfunctions Ġare Ġused Ġextens ively Ġin Ġthis Ġmethod . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Layout ( changed : ĠBoolean , Ġleft : ĠInt , Ġtop : ĠInt , Ġright : ĠInt , Ġbottom : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIcon . ĊĠĠĠĠĠĠĠ Ġwith ( coord ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġicon . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġthe Ġthe Ġx Ġand Ġy Ġcoordinates Ġof Ġthe Ġicon . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġpadding Left Ġ+ Ġit . margin Left () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġpadding Top Ġ+ Ġit . margin Top () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLayout Ġthe Ġicon . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . layout ( x , Ġy , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ+ Ġit . meas ured Width , Ġy Ġ+ Ġit . meas ured Height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠTitle . ĊĠĠĠĠĠĠĠ Ġwith ( coord ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġthe Ġx Ġcoordinate Ġof Ġthe Ġtitle : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġicon 's Ġright Ġcoordinate Ġ+ Ġicon 's Ġright Ġmargin Ġ+ Ġtitle 's Ġleft Ġmargin . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġpadding Left Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( icon ) Ġ{ ĠmarginLeft () Ġ+ Ġmeasured Width Ġ+ ĠmarginRight () Ġ} Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle . margin Left () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġthe Ġy Ġcoordinate Ġof Ġthe Ġtitle : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis ĠViewGroup 's Ġtop Ġpadding Ġ+ Ġtile 's Ġtop Ġmargin . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġpadding Top Ġ+ Ġtitle . margin Top () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLayout Ġthe Ġtitle . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle . layout ( x , Ġy , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ+ Ġtitle . meas ured Width , Ġy Ġ+ Ġtitle . meas ured Height ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSub title . ĊĠĠĠĠĠĠĠ Ġwith ( coord ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġsubtitle Ġhas Ġthe Ġsame Ġx Ġcoordinate Ġas Ġthe Ġtitle , Ġso Ġdon 't Ġreset . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġthe Ġy Ġcoordinate Ġof Ġthe Ġtitle : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtitle 's Ġbottom Ġcoordinate Ġ+ Ġtitle 's Ġbottom Ġmargin Ġ+ Ġsubtitle 's Ġtop Ġmargin . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ+= Ġtitle . meas ured Height Ġ+ Ġtitle . margin Bottom () Ġ+ Ġsubtitle . margin Top () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLayout Ġthe Ġsubtitle . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubtitle . layout ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx , Ġy , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ+ Ġsubtitle . meas ured Width , Ġy Ġ+ Ġsubtitle . meas ured Height ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ }