package Ġcom . gg dsn . pag en avigation bar Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . os . Build Ċ import Ġandroid . support . v 7 . widget . AppCompat ImageView Ċ import Ġandroid . support . v 7 . widget . AppCompat TextView Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Display Metrics Ċ import Ġandroid . view . Gravity Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Scroller Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠL iao X ing yu Ġon Ġ 2 1 / 0 5 / 2 0 1 7 . Ċ Ġ*/ Ċ Ċ class ĠPage NavigationBar Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , Ġattrs : ĠAttributeSet ? Ġ= Ġnull , Ġdef Style Attr : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠViewGroup ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTATE _ INIT Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTATE _ MIDDLE Ġ= Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠtextView Ġ= ĠAppCompat TextView ( context ) ĊĠĠĠ Ġprivate Ġval Ġback Arrow View Ġ= ĠAppCompat ImageView ( context ) ĊĠĠĠ Ġprivate Ġval Ġforward Arrow View Ġ= ĠAppCompat ImageView ( context ) ĊĊĠĠĠ Ġprivate Ġval Ġforward Arrow : ĠDrawable ĊĠĠĠ Ġprivate Ġval Ġdisplay Metrics : ĠDisplay Metrics ĊĠĠĠ Ġprivate Ġval Ġback Arrow : ĠDrawable ĊĠĠĠ Ġprivate Ġval Ġmin Padding Dp Ġ= Ġ 8 ĊĠĠĠ Ġprivate Ġval Ġsteps : ĠMutable List < String > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġprivate Ġvar Ġcurrent Step Idx Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġstate Ġ= ĠSTATE _ INIT ĊĠĠĠ Ġprivate Ġval Ġline Scroller Ġ= ĠSc roller ( context ) ĊĠĠĠ Ġprivate Ġval Ġpaint Ġ= ĠPaint () ĊĠĠĠ Ġprivate Ġval Ġline Rect Ġ= ĠRect () ĊĠĠĠ Ġprivate Ġval ĠlineWidth Dp Ġ= Ġ 4 ĊĠĠĠ Ġprivate Ġvar ĠlineWidth : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġmargin Dp Ġ= Ġ 1 0 ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çĶ¨äºİ æłĩè®° éĤ£ æĿ¡ çº¿ åģı ç§» åĪ°çļĦ ä½įç½® ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġlin ex : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġval ĠmaxHeight Dp : ĠInt Ġ= Ġ 6 4 ĊĊĠĠĠ Ġprivate Ġvar Ġmax Text Width : ĠInt ? Ġ= Ġ 0 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġcontext . resources ĊĠĠĠĠĠĠĠ Ġdisplay Metrics Ġ= Ġres . display Metrics ĊĠĠĠĠĠĠĠ ĠlineWidth Ġ= Ġ( display Metrics . density Ġ* ĠlineWidth Dp ). toInt () ĊĠĠĠĠĠĠĠ Ġpaint . color Ġ= ĠColor . WHITE ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . LO L LI POP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforward Arrow Ġ= Ġcontext . get Drawable ( R . drawable . pag en avigation bar _ selector _ forward _ arrow ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback Arrow Ġ= Ġcontext . get Drawable ( R . drawable . pag en avigation bar _ ic _ arrow _ back _ white _ 2 4 dp ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforward Arrow Ġ= Ġres . get Drawable ( R . drawable . pag en avigation bar _ selector _ forward _ arrow ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback Arrow Ġ= Ġres . get Drawable ( R . drawable . pag en avigation bar _ ic _ arrow _ back _ white _ 2 4 dp ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġback Arrow View . setImage Resource ( R . drawable . pag en avigation bar _ ic _ arrow _ back _ white _ 2 4 dp ) ĊĠĠĠĠĠĠĠ Ġset Background Resource ( R . drawable . pag en avigation bar _ shape _ background ) ĊĊĠĠĠĠĠĠĠ Ġback Arrow View . setImage Resource ( R . drawable . pag en avigation bar _ ic _ arrow _ back _ white _ 2 4 dp ) ĊĠĠĠĠĠĠĠ Ġforward Arrow View . setImage Resource ( R . drawable . pag en avigation bar _ selector _ forward _ arrow ) ĊĊĠĠĠĠĠĠĠ ĠtextView . gravity Ġ= ĠGr avity . CENTER ĊĊĠĠĠĠĠĠĠ Ġif Ġ( isIn Edit Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . text Ġ= Ġ" éĢīæĭ© è®¢åįķ " ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . setTextColor ( res . getColor State List ( R . color . pag en avigation bar _ selector _ text )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtyped Array Ġ= Ġcontext . theme . obtain Styled Attributes ( attrs , ĠR . style able . Page NavigationBar , Ġdef Style Attr , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . text Ġ= Ġtyped Array . getString ( R . style able . Page NavigationBar _ page NavigationBar Title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtyped Array . recycle () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd View ( back Arrow View ) ĊĠĠĠĠĠĠĠ Ġadd View ( textView ) ĊĠĠĠĠĠĠĠ Ġadd View ( forward Arrow View ) ĊĊĠĠĠĠĠĠĠ Ġback Arrow View . setOnClickListener Ġ{ Ġprevious Step () Ġ} ĊĠĠĠĠĠĠĠ Ġforward Arrow View . setOnClickListener Ġ{ Ġnext Step () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= ĠMeasure Spec . getSize ( width Measure Spec ) ĊĠĠĠĠĠĠĠ Ġvar Ġheight Ġ= ĠMeasure Spec . getSize ( height Measure Spec ) ĊĠĠĠĠĠĠĠ Ġval Ġheight Mode Ġ= ĠMeasure Spec . get Mode ( height Measure Spec ) ĊĠĠĠĠĠĠĠ Ġval Ġdensity Ġ= Ġdisplay Metrics . density ĊĊĠĠĠĠĠĠĠ Ġif Ġ( height Mode Ġ== ĠMeasure Spec . AT _ MO ST ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmaxHeight Ġ= Ġ( density Ġ* ĠmaxHeight Dp Ġ- Ġ 2 Ġ* Ġdensity Ġ* Ġmargin Dp ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġif Ġ( height Ġ> ĠmaxHeight ) ĠmaxHeight Ġelse Ġheight ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset Measured Dimension ( width , Ġheight ) ĊĠĠĠĠĠĠĠ Ġlin ex Ġ= Ġmeasured Width Ġ/ Ġ 4 ĊĊĠĠĠĠĠĠĠ Ġval Ġmin Padding Ġ= Ġ( min Padding Dp Ġ* Ġdensity ). toInt () ĊĠĠĠĠĠĠĠ Ġvar Ġpadding Top Ġ= Ġpadding Top ĊĠĠĠĠĠĠĠ Ġif Ġ( padding Top Ġ< Ġmin Padding ) Ġpadding Top Ġ= Ġmin Padding ĊĠĠĠĠĠĠĠ Ġvar Ġpadding Bottom Ġ= Ġpadding Bottom ĊĠĠĠĠĠĠĠ Ġif Ġ( padding Bottom Ġ< Ġmin Padding ) Ġpadding Bottom Ġ= Ġmin Padding ĊĊĠĠĠĠĠĠĠ Ġval Ġcontent Height Ġ= Ġheight Ġ- Ġmin Padding Ġ* Ġ 2 ĊĠĠĠĠĠĠĠ Ġval Ġicon Width Spec Ġ= ĠMeasure Spec . make Measure Spec ( content Height , ĠMeasure Spec . EX ACT LY ) ĊĠĠĠĠĠĠĠ Ġval Ġicon Height Spec Ġ= ĠMeasure Spec . make Measure Spec ( content Height , ĠMeasure Spec . EX ACT LY ) ĊĊĠĠĠĠĠĠĠ Ġback Arrow View . measure ( icon Width Spec , Ġicon Height Spec ) ĊĠĠĠĠĠĠĠ Ġforward Arrow View . measure ( icon Width Spec , Ġicon Height Spec ) ĊĊĠĠĠĠĠĠĠ Ġback Arrow View . translation X Ġ= Ġ- lin ex . toFloat () Ċ // ĠĠĠĠĠĠĠ Ġ åĽłä¸º åı³ è¾¹ æľī åĽ¾ æ¡Ī èĢĮ å·¦ è¾¹ æ²¡æľī ï¼Į è¦ģ ä¿®æŃ£ æłĩé¢ĺ æłı çļĦ ä½įç½® ï¼Į è®© åħ¶ å±ħ ä¸Ń ãĢĤ ĊĠĠĠĠĠĠĠ Ġset Padding ( min Padding , Ġpadding Top , Ġmin Padding , Ġpadding Bottom ) ĊĊĠĠĠĠĠĠĠ Ġmax Text Width Ġ= Ġwidth Ġ- Ġpadding Left Ġ- Ġpadding Right Ġ- Ġcontent Height ĊĠĠĠĠĠĠĠ ĠtextView . measure ( Measure Spec . make Measure Spec ( max Text Width !! , ĠMeasure Spec . AT _ MO ST ), ĠMeasure Spec . make Measure Spec ( content Height , ĠMeasure Spec . EX ACT LY )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Layout ( changed : ĠBoolean , Ġl : ĠInt , Ġt : ĠInt , Ġr : ĠInt , Ġb : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġr Ġ- Ġl ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġb Ġ- Ġt ĊĠĠĠĠĠĠĠ Ġback Arrow View . layout ( padding Left , Ġpadding Top , Ġpadding Left Ġ+ Ġback Arrow View . meas ured Width , Ġheight Ġ- Ġpadding Bottom ) ĊĠĠĠĠĠĠĠ ĠtextView . layout ( padding Left , Ġpadding Top , Ġpadding Left Ġ+ ĠtextView . meas ured Width , Ġheight Ġ- Ġpadding Bottom ) ĊĠĠĠĠĠĠĠ Ġforward Arrow View . layout ( width Ġ- Ġpadding Right Ġ- Ġforward Arrow View . meas ured Width , Ġpadding Top , Ġwidth Ġ- Ġpadding Right , Ġheight Ġ- Ġpadding Bottom ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Titles ( titles : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Titles ( titles , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Titles ( titles : ĠList < String >, Ġinit Step : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// current Step Idx è®¾ç½® æĪĲ - 1 ï¼Į åħį å¾Ĺ èµ° åĪ° set Step () ä¸Ń current Step Idx == step çĽ´æİ¥ return äºĨ ĊĠĠĠĠĠĠĠ Ġcurrent Step Idx Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġsteps . clear () ĊĠĠĠĠĠĠĠ Ġsteps . addAll ( titles ) ĊĠĠĠĠĠĠĠ Ġset Step ( init Step ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnext Step () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Step ( if Ġ( current Step Idx Ġ< Ġsteps . size Ġ- Ġ 1 ) Ġcurrent Step Idx Ġ+ Ġ 1 Ġelse Ġsteps . size Ġ- Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprevious Step () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Step ( if Ġ( current Step Idx Ġ> Ġ 0 ) Ġcurrent Step Idx Ġ- Ġ 1 Ġelse Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Step ( step : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġshow State ( state : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ INIT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Scroller . start Scroll ( lin ex , Ġ 0 , Ġ- lin ex , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTATE _ MIDDLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Scroller . start Scroll ( 0 , Ġ 0 , Ġlin ex , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . state Ġ= Ġstate ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( step Ġ< Ġ 0 Ġ|| Ġstep Ġ> Ġsteps . size Ġ|| Ġcurrent Step Idx Ġ== Ġstep ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent Step Idx Ġ= Ġstep ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġsteps [ step ] ĊĠĠĠĠĠĠĠ ĠtextView . text Ġ= Ġs ĊĠĠĠĠĠĠĠ Ġwhen Ġ( step ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ!= ĠSTATE _ INIT ) Ġshow State ( STATE _ INIT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ!= ĠSTATE _ MIDDLE ) Ġshow State ( STATE _ MIDDLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetCurrent Step (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent Step Idx ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcompute Scroll () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( line Scroller . compute Scroll Offset ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġleft Ġ= Ġline Scroller . curr X Ġ- ĠlineWidth ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ= Ġif Ġ( left Ġ< Ġ 0 ) Ġ 0 Ġelse Ġleft ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . translation X Ġ= Ġleft . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback Arrow View . translation X Ġ= Ġleft . toFloat () Ġ- Ġlin ex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Rect . set ( left , Ġ 0 , Ġline Scroller . curr X , Ġheight ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġcanvas ?. draw Rect ( line Rect , Ġpaint ) ĊĠĠĠ Ġ} Ċ Ċ }