package Ġcn . l vs ong . lib . library . view Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Base Adapter Ċ import Ġcn . l vs ong . lib . library . utils . Density Util Ċ import Ġcn . l vs ong . lib . library . R Ċ Ċ /** Ċ Ġ* Ġ å¤´ åĥı éĥ¨åĪĨ éĩį åı ł Ċ Ġ* Ġ@ ProjectName : ĠĠĠ ĠMV VM Test Ċ Ġ* Ġ@ Package : ĠĠĠĠĠĠĠ Ġcn . l vs ong . lib . library . view Ċ Ġ* Ġ@ ClassName : ĠĠĠĠĠ ĠArrange View Ċ Ġ* Ġ@ Description : ĠĠĠ Ġ å¤´ åĥı æĮī åºı æİĴ åĪĹ Ċ Ġ* Ġ@ Author : ĠĠĠĠĠĠĠĠ ĠJ oo yer Ċ Ġ* Ġ@ Create Date : ĠĠĠĠĠ 2 0 2 0 / 5 / 2 9 Ġ 1 1 : 3 8 Ċ Ġ* Ġ@ Update User : Ċ Ġ* Ġ@ Update Date : Ċ Ġ* Ġ@ Update Remark : Ċ Ġ* Ġ@ Version : ĠĠĠĠĠĠĠĠ 1 . 0 Ċ Ġ* ĠViewGroup åıĬ åħ¶ åŃĲ ç±» å¦Ĥæŀľ è¦ģ æĥ³ æĮĩå®ļ åŃĲ View çļĦ ç»ĺ åĪ¶ é¡ºåºı åıª éľĢ ä¸¤ æŃ¥ : Ċ Ġ* Ġ 1 ï¼Į set Children Drawing Order Enabled ( true ) Ġ å¼ĢåĲ¯ èĩªå®ļä¹ī åŃĲ View çļĦ ç»ĺ åĪ¶ é¡ºåºı ; Ċ Ġ* Ġ 2 ï¼Į çĶ¨ set Z ( float ), èĩªå®ļä¹ī Z åĢ¼ ï¼Į åĢ¼ è¶Ĭ å¤§ è¶Ĭ ä¼ĺåħĪ ç»ĺ åĪ¶ ï¼Ľ Ċ Ġ* Ġhttps :// github . com / h ns y cs x hz c sh / Dis cussion Avatar View Ċ Ġ*/ ĊĊ Ċ /* ĊĠĠĠ Ġ< cn . l vs ong . lib . library . view . Arrange View ĊĠĠĠĠĠĠĠ Ġandroid : id ="@ + id / av _ avatar _ item _ people " ĊĠĠĠĠĠĠĠ Ġandroid : layout _ width =" wrap _ content " ĊĠĠĠĠĠĠĠ Ġandroid : layout _ height ="@ dim en / height _ 2 5 " ĊĠĠĠĠĠĠĠ Ġandroid : layout _ margin End ="@ dim en / padding _ 3 2 " ĊĠĠĠĠĠĠĠ Ġapp : av _ first _ show _ top =" false " ĊĠĠĠĠĠĠĠ Ġapp : av _ show _ count =" 6 " ĊĠĠĠĠĠĠĠ Ġapp : av _ space _ width =" 5 dp " ĊĠĠĠĠĠĠĠ Ġapp : layout _ constraint Bottom _ to Bottom Of ="@ id / dv _ tips _ item _ people " ĊĠĠĠĠĠĠĠ Ġapp : layout _ constraint End _ to EndOf =" parent " ĊĠĠĠĠĠĠĠ Ġapp : layout _ constraint Top _ to Top Of ="@ id / dv _ tips _ item _ people " Ġ/> Ċ Ġ*/ Ċ Ċ class ĠArrange View ( context : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: ĠViewGroup ( context , Ġattrs ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæķ°æį® éĢĤ éħį åĻ¨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġm Arrange Adapter : ĠArrange Adapter ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ Ġæ¯ı ä¸Ģä¸ª Item éĩį åı ł éĥ¨åĪĨ , é»ĺè®¤ 2 0 dp ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġm Space Width Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġä¸Ģ åħ± æĺ¾ç¤º å¤ļä¸ª Item View , é»ĺè®¤ 4 ä¸ª ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġm Show Count Ġ= Ġ 4 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ç¬¬ä¸Ģä¸ª åľ¨ æľĢ ä¸ĬéĿ¢ , é»ĺè®¤ ä¸įæĺ¯ çļĦ ( æľĢåĲİ ä¸Ģä¸ª åľ¨ æľĢ ä¸ĬéĿ¢ ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġfirst Is Top Ġ= Ġfalse ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġis Children Drawing Order Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġparse Attrs ( context , Ġattrs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Attrs ( context : ĠContext , Ġattrs : ĠAttributeSet ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarr Ġ= Ġcontext . obtain Styled Attributes ( attrs , ĠR . style able . Arrange View ) ĊĠĠĠĠĠĠĠ Ġm Space Width Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarr . get Dimension Pixel Offset ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Arrange View _ av _ space _ width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠD ensity Util . dp 2 px Rt Int ( 2 0 F ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġm Show Count Ġ= Ġarr . getInt ( R . style able . Arrange View _ av _ show _ count , Ġm Show Count ) ĊĠĠĠĠĠĠĠ Ġfirst Is Top Ġ= Ġarr . getBoolean ( R . style able . Arrange View _ av _ first _ show _ top , Ġfirst Is Top ) ĊĠĠĠĠĠĠĠ Ġarr . recycle () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Measure ( width Measure Spec , Ġheight Measure Spec ) ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= ĠMeasure Spec . getSize ( width Measure Spec ) ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= ĠMeasure Spec . getSize ( height Measure Spec ) ĊĠĠĠĠĠĠĠ Ġval Ġwidth Mode Ġ= ĠMeasure Spec . get Mode ( width Measure Spec ) ĊĠĠĠĠĠĠĠ Ġval Ġheight Mode Ġ= ĠMeasure Spec . get Mode ( height Measure Spec ) ĊĠĠĠĠĠĠĠ Ġvar Ġcalc Width Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġcalc Height Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġm Arrange Adapter ?. let Ġ{ Ġadapter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Count Ġ= Ġif Ġ( adapter . count Ġ> Ġm Show Count ) Ġm Show Count Ġelse Ġadapter . count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġchild Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġget Child At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeasure Child ( child , Ġwidth Measure Spec , Ġheight Measure Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġm Show Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( 0 Ġ== Ġi ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Width Ġ= Ġchild . meas ured Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Height Ġ= Ġchild . meas ured Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Width Ġ+= Ġchild . meas ured Width Ġ- Ġm Space Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Height Ġ= Ġchild . meas ured Height . coerce At Least ( height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Measured Dimension ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Measure Spec . EX ACT LY Ġ== Ġwidth Mode ) Ġwidth Ġelse Ġcalc Width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Measure Spec . EX ACT LY Ġ== Ġheight Mode ) Ġheight Ġelse Ġcalc Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Layout ( changed : ĠBoolean , Ġl : ĠInt , Ġt : ĠInt , Ġr : ĠInt , Ġb : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchild Count Ġ= Ġchild Count ĊĠĠĠĠĠĠĠ Ġif Ġ( child Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtop Ġ= Ġ( this . height Ġ- Ġheight ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġleft Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġchild Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġm Show Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġget Child At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġchild . meas ured Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġchild . meas ured Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( 0 Ġ== Ġi ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . layout ( left , Ġtop , Ġwidth , Ġheight ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ+= Ġwidth Ġ- Ġm Space Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . layout ( left , Ġtop , Ġleft Ġ+ Ġwidth , Ġheight ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæķ°æį® éĢĤ éħį åĻ¨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġclass ĠArrange Adapter ( val Ġdata : ĠList < String >) Ġ: ĠBase Adapter () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget View ( position : ĠInt , ĠconvertView : ĠView ?, Ġparent : ĠViewGroup ): ĠView Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Range View ( position , Ġparent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem ( position : ĠInt ) Ġ= Ġdata [ position ] ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Id ( position : ĠInt ) Ġ= Ġposition . to Long () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Count () Ġ= Ġdata . size ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġget Range View ( position : ĠInt , Ġparent : ĠViewGroup ): ĠView ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġè®¾ç½® éĢĤ éħį åĻ¨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Adapter ( adapter : ĠArrange Adapter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove All Views () ĊĠĠĠĠĠĠĠ Ġthis . m Arrange Adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġadapter . count ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġcount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġm Show Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġadapter . getView ( i , Ġnull , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Is Top ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . z Ġ= Ġ( count Ġ- Ġ 1 Ġ- Ġi ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . addView ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }