package Ġcom . andre ha ue is en . list ade jan ot . views Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Color State List Ċ import Ġandroid . content . res . Resources Ċ import Ġandroid . os . Build Ċ import Ġandroid . support . design . widget . Floating ActionButton Ċ import Ġandroid . support . v 4 . content . Context Compat Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Menu Inflater Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View . OnClickListener Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . animation . Animation Ċ import Ġandroid . view . animation . Animation Utils Ċ import Ġandroid . widget . PopupMenu Ċ import Ġandroid . widget . TextView Ċ import Ġcom . andre ha ue is en . list ade jan ot . R Ċ import Ġcom . andre ha ue is en . list ade jan ot . utilities . convert Dip To Pixel Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġand re Ġon Ġ 1 0 / 2 0 / 2 0 1 7 . Ċ Ġ*/ Ċ class ĠF ab Menu Ġ@ Jvm Over loads Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ? Ġ= Ġnull , Ġdef Style Attr : ĠInt Ġ= Ġ 0 ) ĊĠĠĠ Ġ: ĠViewGroup ( context , Ġattrs , Ġdef Style Attr ), ĠView . OnClickListener Ġ{ ĊĊĠĠĠ Ġinterface ĠOptions Click Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Option Click ( option Id : ĠInt ?) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠDirection Ġ{ ĊĠĠĠĠĠĠĠ ĠEX PAN DED , ĠCOL LAP SED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġoptions Ġ= ĠPopup Menu ( context , Ġnull ). menu ĊĠĠĠ Ġprivate Ġvar Ġinflater Ġ= ĠMenu Inflater ( context ) ĊĠĠĠ Ġprivate Ġvar Ġinitial Fab Ġ= ĠFloating ActionButton ( context ) ĊĠĠĠ Ġprivate Ġvar Ġclick Callback : ĠOptions Click ? Ġ= Ġnull ĊĊĠĠĠ Ġ// Ġinitial Ġstate Ġis Ġcollapsed ĊĠĠĠ Ġprivate Ġvar Ġstate Ġ= ĠDirection . COLL AP SED ĊĊĠĠĠ Ġ// Ġtag Ġid ĊĠĠĠ Ġprivate Ġval Ġtag Id Ġ= ĠR . id . fab _ tag ĊĊĠĠĠ Ġ// Ġmax Ġsizes ĊĠĠĠ Ġprivate Ġvar Ġmax Button Width Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġmax Button Height Ġ= Ġ 0 ĊĊĠĠĠ Ġ// Ġlayout Ġparameters ĊĠĠĠ Ġprivate Ġvar Ġfab Spacing Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġinitial Fab Right Margin Ġ= Ġ 2 0 ĊĠĠĠ Ġprivate Ġval Ġinitial Fab Bottom Margin Ġ= Ġ 2 5 ĊĠĠĠ Ġprivate Ġval Ġlabel Spacing Ġ= Ġ 2 0 ĊĠĠĠ Ġprivate Ġval Ġchild Elevation Ġ= Ġ 6 f ĊĠĠĠ Ġprivate Ġval Ġlabel Padding Ġ= Ġ 1 4 ĊĠĠĠ Ġprivate Ġval Ġview Id Ġ= Ġthis . id ĊĊĠĠĠ Ġ// Ġanimations ĊĠĠĠ Ġprivate Ġval Ġexpand Initial Fab Ġ= ĠAnimation Utils . load Animation ( context , ĠR . anim . fab _ menu _ main _ expand ) ĊĠĠĠ Ġprivate Ġval Ġcollapse Initial Fab Ġ= ĠAnimation Utils . load Animation ( context , ĠR . anim . fab _ menu _ main _ collapse ) ĊĠĠĠ Ġprivate Ġval Ġup Child Animation Ġ= ĠAnimation Utils . load Animation ( context , ĠR . anim . fab _ menu _ child _ expand ) ĊĠĠĠ Ġprivate Ġval Ġdown Child Animation Ġ= ĠAnimation Utils . load Animation ( context , ĠR . anim . fab _ menu _ child _ collapse ) ĊĊĠĠĠ Ġ// Ġbackground Ġcolors ĊĠĠĠ Ġprivate Ġvar Ġexpanded BackgroundColor Ġ= ĠContext Compat . getColor ( context , Ġandroid . R . color . transparent ) ĊĠĠĠ Ġprivate Ġvar Ġcolor Main Button Ġ= ĠContext Compat . getColor ( context , ĠR . color . om fm _ default _ color ) ĊĠĠĠ Ġprivate Ġvar Ġcolor Secondary Buttons Ġ= ĠContext Compat . getColor ( context , ĠR . color . om fm _ default _ color ) ĊĊĠĠĠ Ġ// ĠF ab Ġclick Ġlistener ĊĠĠĠ Ġprivate Ġval Ġfab ClickListener Ġ= ĠOn ClickListener Ġ{ ĊĠĠĠĠĠĠĠ Ġclick Callback ?. on Option Click ( it . id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġinitialize UI ( attrs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/// ĠOverride Ġmethods ĊĊĠĠĠ Ġoverride Ġfun Ġon Layout ( changed : ĠBoolean , Ġleft : ĠInt , Ġtop : ĠInt , Ġright : ĠInt , Ġbottom : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġcalculating Ġthe Ġinitial Ġbutton Ġsizes Ġfor Ġuse Ġas Ġreference ĊĠĠĠĠĠĠĠ Ġval Ġslide Value Ġ= Ġcontext . convert Dip To Pixel ( 1 4 F ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġhorizontal Center Ġ= Ġ( right Ġ- Ġleft Ġ- Ġ( max Button Width Ġ/ Ġ 2 )) Ġ+ Ġslide Value ĊĊĠĠĠĠĠĠĠ Ġval Ġinitial Fab Top Ġ= Ġbottom Ġ- Ġtop Ġ- Ġinitial Fab . meas ured Height ĊĠĠĠĠĠĠĠ Ġval Ġinitial Fab Left Ġ= Ġ( horizontal Center Ġ- Ġ( initial Fab . meas ured Width Ġ/ Ġ 2 )) ĊĠĠĠĠĠĠĠ Ġval Ġinitial Fab Right Ġ= Ġinitial Fab Left Ġ+ Ġinitial Fab . meas ured Width ĊĠĠĠĠĠĠĠ Ġval Ġinitial Fab Bottom Ġ= Ġinitial Fab Top Ġ+ Ġinitial Fab . meas ured Height ĊĊĠĠĠĠĠĠĠ Ġinitial Fab . layout ( initial Fab Left Ġ- Ġinitial Fab Right Margin , Ġinitial Fab Top Ġ- Ġinitial Fab Bottom Margin , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Fab Right Ġ- Ġinitial Fab Right Margin , Ġinitial Fab Bottom Ġ- Ġinitial Fab Bottom Margin ) ĊĠĠĠĠĠĠĠ Ġinitial Fab . setOnClickListener ( this @ Fab Menu ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġbring Ġthe Ġinitial Ġfab Ġto Ġfront Ġso Ġwe Ġcan ĊĠĠĠĠĠĠĠ Ġ// Ġcall Ġit ĠonClick Ġwhen Ġthe Ġmenu Ġis Ġcollapsed ĊĠĠĠĠĠĠĠ Ġbring Child To Front ( initial Fab ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlabels Offset Ġ= Ġ( max Button Width Ġ/ Ġ 2 ) Ġ- Ġslide Value ĊĊĠĠĠĠĠĠĠ Ġvar Ġnext Y Ġ= Ġif Ġ( is Expanded ()) Ġinitial Fab Top Ġ- Ġfab Spacing ĊĠĠĠĠĠĠĠ Ġelse Ġinitial Fab Top Ġ+ Ġinitial Fab . meas ured Height Ġ+ Ġfab Spacing ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. ( child Count Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġget Child At ( i ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġskipping Ġgone Ġviews Ġ( because Ġwe Ġdon 't Ġneed Ġto Ġcalculate ) Ġand ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġinitial Ġbutton ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view . id Ġ!= Ġinitial Fab . id Ġ&& Ġview . visibility Ġ!= ĠView . GONE ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġposition ing Ġthe Ġfab Ġbutton ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild X Ġ= Ġhorizontal Center Ġ- Ġ( view . meas ured Width Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Y Ġ= Ġif Ġ( state Ġ== ĠDirection . EXP AN DED ) Ġnext Y Ġ- Ġview . meas ured Height Ġelse Ġnext Y ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . layout ( child X Ġ- Ġinitial Fab Right Margin , Ġchild Y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild X Ġ+ Ġview . meas ured Width Ġ- Ġinitial Fab Right Margin , Ġchild Y Ġ+ Ġview . meas ured Height ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . translation Y Ġ= Ġif Ġ( is Expanded ()) Ġ 0 f Ġelse Ġ( initial Fab Top Ġ- Ġchild Y ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . alpha Ġ= Ġif Ġ( is Expanded ()) Ġ 1 f Ġelse Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . setOnClickListener ( if Ġ( is Expanded ()) Ġfab ClickListener Ġelse Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġposition ing Ġthe Ġlabel Ġon Ġthe Ġleft Ġof Ġfab ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlabel Ġ= Ġview . getTag ( tag Id ) Ġas ? ĠTextView ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( label Ġ!= Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlabel Right Ġ= Ġhorizontal Center Ġ- Ġlabels Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlabel Left Ġ= Ġlabel Right Ġ- Ġlabel . meas ured Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlabel Top Ġ= Ġchild Y Ġ+ Ġ( view . meas ured Height Ġ- Ġlabel . meas ured Height ) Ġ/ Ġ 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel . layout ( label Left Ġ- Ġlabel Spacing , Ġlabel Top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Right Ġ- Ġlabel Spacing , Ġlabel Top Ġ+ Ġlabel . meas ured Height ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel . translation Y Ġ= Ġif Ġ( is Expanded ()) Ġ 0 f Ġelse Ġ( initial Fab Top Ġ- Ġchild Y ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel . alpha Ġ= Ġif Ġ( is Expanded ()) Ġ 1 f Ġelse Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Y Ġ= Ġif Ġ( is Expanded ()) Ġchild Y Ġ- Ġfab Spacing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġchild Y Ġ+ Ġview . meas ured Height Ġ+ Ġfab Spacing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmeasure Children ( width Measure Spec , Ġheight Measure Spec ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġinitializing Ġvalues ĊĠĠĠĠĠĠĠ Ġvar Ġheight Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġmax Label Width Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġwidth Ġ= ĠResources . getSystem (). display Metrics . width Pixels ĊĊĠĠĠĠĠĠĠ Ġmax Button Width Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġmax Button Height Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ// Ġcalculating Ġthe Ġsize Ġof Ġevery Ġfab Ġ+ Ġlabel ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. ( child Count Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġget Child At ( i ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view . visibility Ġ!= ĠView . GONE ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Button Width Ġ= ĠMath . max ( max Button Width , Ġview . meas ured Width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ+= Ġview . meas ured Height ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcalculating Ġthe Ġwidth Ġof Ġthe Ġlabel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlabel Ġ= Ġview . getTag ( tag Id ) Ġas ? ĠTextView ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( label Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Label Width Ġ= ĠMath . max ( max Label Width , Ġlabel . meas ured Width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Expanded ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġthe Ġview Ġis Ġexpanded , Ġthe Ġheight Ġand Ġwidth Ġneed Ġto Ġbe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġentire Ġscreen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= ĠResources . getSystem (). display Metrics . height Pixels ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset BackgroundColor ( expanded BackgroundColor ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcalculating Ġthe Ġtotal Ġwidth Ġand Ġheight Ġof Ġthe Ġcomponent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġmax Button Width Ġ+ Ġif Ġ( max Label Width Ġ> Ġ 0 ) Ġmax Label Width Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ+= Ġfab Spacing Ġ* Ġ( options . size () Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset BackgroundColor ( Context Compat . getColor ( context , Ġandroid . R . color . transparent )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġset Measured Dimension ( width , Ġheight ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonClick ( view : ĠView ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Expanded ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠDirection . COLL AP SED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Fab . start Animation ( collapse Initial Fab ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimate Children ( down Child Animation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . setOnClickListener ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . is Clickable Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠDirection . EXP AN DED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Fab . start Animation ( expand Initial Fab ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimate Children ( up Child Animation ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . setOnClickListener Ġ{ Ġview _ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Expanded () Ġ&& Ġview _. id Ġ== Ġview Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Fab . perform Click () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . setOnClickListener ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . is Clickable Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrequest Layout () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/// ĠPublic Ġmethods ĊĊĠĠĠ Ġfun Ġset Options Click ( callback : ĠOptions Click ) Ġ{ ĊĠĠĠĠĠĠĠ Ġclick Callback Ġ= Ġcallback ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/// ĠPrivate Ġmethods ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize UI ( attrs : ĠAttributeSet ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġattributes Ġ= Ġcontext . obtain Styled Attributes ( attrs , ĠR . style able . Fab Menu ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( attributes . hasValue ( R . style able . Fab Menu _ content _ options )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinflater . inflate ( attributes . getResource Id ( R . style able . Fab Menu _ content _ options , Ġ 0 ), Ġoptions ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Custom Fab Menu Ġneed Ġto Ġhave Ġapp : content _ options Ġwith Ġa Ġresource Ġmenu !") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmain Button Color Ġ= Ġattributes . getResource Id ( R . style able . Fab Menu _ color _ main _ button , ĠR . color . om fm _ default _ color ) ĊĠĠĠĠĠĠĠ Ġthis . color Main Button Ġ= ĠContext Compat . getColor ( context , Ġmain Button Color ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsecondary Button Color Ġ= Ġattributes . getResource Id ( R . style able . Fab Menu _ color _ secondary _ buttons , ĠR . color . om fm _ default _ color ) ĊĠĠĠĠĠĠĠ Ġthis . color Secondary Buttons Ġ= ĠContext Compat . getColor ( context , Ġsecondary Button Color ) ĊĊĠĠĠĠĠĠĠ Ġval ĠbackgroundColor Ġ= Ġattributes . getResource Id ( R . style able . Fab Menu _ expanded _ background _ color , Ġandroid . R . color . transparent ) ĊĠĠĠĠĠĠĠ Ġthis . expanded BackgroundColor Ġ= ĠContext Compat . getColor ( context , ĠbackgroundColor ) ĊĊĠĠĠĠĠĠĠ Ġadd Buttons () ĊĊĠĠĠĠĠĠĠ Ġattributes . recycle () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Buttons () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġthe Ġother Ġbuttons Ġfrom Ġthe Ġoptions Ġ" menu " ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. ( options . size () Ġ- Ġ 1 )) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġoptions . getItem ( i ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcreating Ġthe Ġfloating Ġaction Ġbutton ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfab Ġ= Ġbuild Fab Button ( item , Ġi Ġ== Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Ġthe Ġfirst Ġposition Ġof Ġthe Ġoptions Ġarray ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġbe Ġthe Ġfirst Ġfab Ġbutton Ġof Ġthe Ġcomponent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Fab Ġ= Ġfab ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcreating Ġthe Ġlabel Ġfor Ġthe Ġbutton ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlabel Ġ= Ġbuild Text Label ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfab . setTag ( tag Id , Ġlabel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( label ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd Ġthe Ġviews ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( fab ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Expanded (): ĠBoolean Ġ= Ġstate Ġ== ĠDirection . EXP AN DED ĊĊĠĠĠ Ġprivate Ġfun Ġanimate Children ( animation : ĠAnimation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. ( child Count Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġget Child At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child . id Ġ!= Ġinitial Fab . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . start Animation ( animation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Fab Button ( item : ĠMenuItem , Ġis First : ĠBoolean ): ĠFloating ActionButton Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfab Ġ= ĠFloating ActionButton ( context ) ĊĠĠĠĠĠĠĠ Ġfab . id Ġ= Ġitem . itemId ĊĠĠĠĠĠĠĠ Ġfab . layout Params Ġ= Ġgenerate Default LayoutParams () ĊĠĠĠĠĠĠĠ Ġfab . setImage Drawable ( item . icon ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġif Ġ( is First ) ĠFloating ActionButton . SIZE _ NORMAL Ġelse ĠFloating ActionButton . SIZE _ MIN I ĊĠĠĠĠĠĠĠ Ġfab . size Ġ= Ġsize ĊĊĠĠĠĠĠĠĠ Ġval Ġbutton Color Ġ= Ġif Ġ( is First ) Ġcolor Main Button Ġelse Ġcolor Secondary Buttons ĊĠĠĠĠĠĠĠ Ġfab . background Tint List Ġ= ĠColor State List . valueOf ( button Color ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= Ġ 2 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfab . elevation Ġ= Ġchild Elevation ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfab ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Text Label ( item : ĠMenuItem ): ĠTextView Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlabel Ġ= ĠTextView ( context ) ĊĠĠĠĠĠĠĠ Ġlabel . text Ġ= Ġitem . title ĊĠĠĠĠĠĠĠ Ġlabel . background Ġ= ĠContext Compat . get Drawable ( context , ĠR . drawable . shape _ rounded _ corners ) ĊĠĠĠĠĠĠĠ Ġlabel . layout Params Ġ= Ġgenerate Default LayoutParams () ĊĠĠĠĠĠĠĠ Ġlabel . set Padding ( label Padding , Ġlabel Padding , Ġlabel Padding , Ġlabel Padding ) ĊĠĠĠĠĠĠĠ Ġlabel . setTextColor ( Context Compat . getColor ( context , ĠR . color . color Primary Dark )) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= Ġ 2 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlabel . elevation Ġ= Ġchild Elevation ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlabel ĊĠĠĠ Ġ} Ċ }