package Ġcom . hl . u ikit . flow layout Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġcom . hl . u ikit . R Ċ import Ġjava . util .* ĊĊĊĊĊ Ċ open Ġclass ĠFlow Layout Ġ@ Jvm Over loads Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ? Ġ= Ġnull , Ġdef Style : ĠInt Ġ= Ġ 0 ) Ġ: ĊĠĠĠ ĠViewGroup ( context , Ġattrs , Ġdef Style ) Ġ{ ĊĊĠĠĠ Ġprotected Ġvar Ġm All Views : ĠMutable List < Mutable List < View >> Ġ= Ġmutable ListOf () ĊĠĠĠ Ġprotected Ġvar Ġm Line Height : ĠMutable List < Int > Ġ= ĠArrayList () ĊĠĠĠ Ġprotected Ġvar Ġm LineWidth : ĠMutable List < Int > Ġ= ĠArrayList () ĊĠĠĠ Ġprivate Ġval Ġm Gravity : ĠInt ĊĠĠĠ Ġprivate Ġvar Ġline Views : ĠMutable List < View > Ġ= ĠArrayList () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġta Ġ= Ġcontext . obtain Styled Attributes ( attrs , ĠR . style able . UIKit Tag Flow Layout ) ĊĠĠĠĠĠĠĠ Ġm Gravity Ġ= Ġta . getInt ( R . style able . UIKit Tag Flow Layout _ u ikit _ tag _ gravity , ĠLEFT ) ĊĠĠĠĠĠĠĠ Ġta . recycle () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsize Width Ġ= ĠMeasure Spec . getSize ( width Measure Spec ) ĊĠĠĠĠĠĠĠ Ġval Ġmode Width Ġ= ĠMeasure Spec . get Mode ( width Measure Spec ) ĊĠĠĠĠĠĠĠ Ġval Ġsize Height Ġ= ĠMeasure Spec . getSize ( height Measure Spec ) ĊĠĠĠĠĠĠĠ Ġval Ġmode Height Ġ= ĠMeasure Spec . get Mode ( height Measure Spec ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġwrap _ content ĊĠĠĠĠĠĠĠ Ġvar Ġwidth Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġheight Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġvar ĠlineWidth Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġline Height Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġc Count Ġ= Ġchild Count ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġc Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġget Child At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child . visibility Ġ== ĠView . GONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġc Count Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= ĠMath . max ( lineWidth , Ġwidth ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ+= Ġline Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeasure Child ( child , Ġwidth Measure Spec , Ġheight Measure Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlp Ġ= Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layout Params Ġas ĠMargin LayoutParams ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Width Ġ= Ġ( child . meas ured Width Ġ+ Ġlp . left Margin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġlp . right Margin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Height Ġ= Ġ( child . meas ured Height Ġ+ Ġlp . top Margin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġlp . bottom Margin ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lineWidth Ġ+ Ġchild Width Ġ> Ġsize Width Ġ- Ġpadding Left Ġ- Ġpadding Right ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= ĠMath . max ( width , ĠlineWidth ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlineWidth Ġ= Ġchild Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ+= Ġline Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Height Ġ= Ġchild Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlineWidth Ġ+= Ġchild Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Height Ġ= ĠMath . max ( line Height , Ġchild Height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġc Count Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= ĠMath . max ( lineWidth , Ġwidth ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ+= Ġline Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset Measured Dimension ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mode Width Ġ== ĠMeasure Spec . EX ACT LY ) Ġsize Width Ġelse Ġwidth Ġ+ Ġpadding Left Ġ+ Ġpadding Right , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mode Height Ġ== ĠMeasure Spec . EX ACT LY ) Ġsize Height Ġelse Ġheight Ġ+ Ġpadding Top Ġ+ Ġpadding Bottom // ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Layout ( changed : ĠBoolean , Ġl : ĠInt , Ġt : ĠInt , Ġr : ĠInt , Ġb : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm All Views . clear () ĊĠĠĠĠĠĠĠ Ġm Line Height . clear () ĊĠĠĠĠĠĠĠ Ġm LineWidth . clear () ĊĠĠĠĠĠĠĠ Ġline Views . clear () ĊĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġwidth ĊĊĠĠĠĠĠĠĠ Ġvar ĠlineWidth Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġline Height Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġc Count Ġ= Ġchild Count ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġc Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġget Child At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child . visibility Ġ== ĠView . GONE ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlp Ġ= Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layout Params Ġas ĠMargin LayoutParams ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Width Ġ= Ġchild . meas ured Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Height Ġ= Ġchild . meas ured Height ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Width Ġ+ ĠlineWidth Ġ+ Ġlp . left Margin Ġ+ Ġlp . right Margin Ġ> Ġwidth Ġ- Ġpadding Left Ġ- Ġpadding Right ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Line Height . add ( line Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm All Views . add ( line Views ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm LineWidth . add ( lineWidth ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlineWidth Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Height Ġ= Ġchild Height Ġ+ Ġlp . top Margin Ġ+ Ġlp . bottom Margin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Views Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlineWidth Ġ+= Ġchild Width Ġ+ Ġlp . left Margin Ġ+ Ġlp . right Margin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Height Ġ= ĠMath . max ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Height , Ġchild Height Ġ+ Ġlp . top Margin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġlp . bottom Margin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Views . add ( child ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Line Height . add ( line Height ) ĊĠĠĠĠĠĠĠ Ġm LineWidth . add ( lineWidth ) ĊĠĠĠĠĠĠĠ Ġm All Views . add ( line Views ) ĊĊĊĠĠĠĠĠĠĠ Ġvar Ġleft Ġ= Ġpadding Left ĊĠĠĠĠĠĠĠ Ġvar Ġtop Ġ= Ġpadding Top ĊĠĠĠĠĠĠĠ Ġval Ġcol ums = 3 ĊĠĠĠĠĠĠĠ Ġval Ġmargin = 0 ĊĠĠĠĠĠĠĠ Ġval Ġline Num Ġ= Ġm All Views . size ĊĠĠĠĠĠĠĠ Ġval Ġgrid W Ġ= Ġ( width Ġ- Ġmargin Ġ* Ġ( col ums Ġ- Ġ 1 )) Ġ/ Ġcol ums // Ġ æł¼ åŃĲ å®½åº¦ ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġline Num ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Views Ġ= Ġm All Views [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Height Ġ= Ġm Line Height [ i ] ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġgravity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent LineWidth Ġ= Ġthis . m LineWidth [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( this . m Gravity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLEFT Ġ-> Ġleft Ġ= Ġpadding Left ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC ENTER Ġ-> Ġleft Ġ= Ġ( width Ġ- Ġcurrent LineWidth ) Ġ/ Ġ 2 Ġ+ Ġpadding Left ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRIGHT Ġ-> Ġleft Ġ= Ġwidth Ġ- Ġcurrent LineWidth Ġ+ Ġpadding Left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġline Views . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġline Views [ j ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child . visibility Ġ== ĠView . GONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlp Ġ= Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layout Params Ġas ĠMargin LayoutParams ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ= Ġj Ġ* Ġgrid W Ġ+ Ġj Ġ* Ġmargin ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlc Ġ= Ġleft Ġ+ Ġlp . left Margin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtc Ġ= Ġtop Ġ+ Ġlp . top Margin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrc Ġ= Ġlc Ġ+ Ġchild . meas ured Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbc Ġ= Ġtc Ġ+ Ġchild . meas ured Height ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . layout ( lc , Ġtc , Ġrc , Ġbc ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ+= Ġ( child . meas ured Width Ġ+ Ġlp . left Margin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġlp . right Margin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ+= Ġline Height ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate LayoutParams ( attrs : ĠAttributeSet ): ĠLayout Params Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMargin LayoutParams ( context , Ġattrs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate Default LayoutParams (): ĠLayout Params Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMargin LayoutParams ( LayoutParams . WRAP _ CONTENT , ĠLayout Params . WRAP _ CONTENT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate LayoutParams ( p : ĠLayout Params ): ĠLayout Params Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMargin LayoutParams ( p ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Flow Layout " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLEFT Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠC ENTER Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠRIGHT Ġ= Ġ 1 ĊĠĠĠ Ġ} Ċ } Ċ