package Ġcom . yang . lib _ common . widget Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . graphics . Rect F Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . ImageView Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġcom . bump tech . glide . request . RequestOptions Ċ import Ġcom . yang . lib _ common . R Ċ import Ġcom . yang . lib _ common . util . dip 2 px Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . ceil Ċ Ċ class ĠGrid N ine Picture View Ġ: ĠViewGroup Ġ{ ĊĊĠĠĠ Ġprivate Ġvar ĠmContext : ĠContext ĊĠĠĠ Ġprivate Ġvar Ġm Width : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Height : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġdata Size Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġspan Count Ġ= Ġ 3 ĊĠĠĠ Ġprivate Ġvar Ġm ImageView Width : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġrect F : ĠRect F Ġ= ĠRect F () ĊĠĠĠ Ġprivate Ġvar Ġmax Child Ġ= Ġ 9 ĊĠĠĠ Ġprivate Ġvar Ġm Paint Ġ= ĠPaint () ĊĠĠĠ Ġprivate Ġvar Ġm Text Paint Ġ= ĠPaint () ĊĠĠĠ Ġvar Ġimage Callback : ĠImage Callback ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġchild View : ViewGroup ĊĊĠĠĠ Ġinterface ĠImage Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġimage ClickListener ( position : ĠInt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġdata : ĠMutable List < String > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . removeAll Views () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Size Ġ= Ġfield . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! field . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġif Ġ( data Size Ġ> Ġmax Child ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Child ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild View Ġ= ĠLayoutInflater . from ( mContext ). inflate ( R . layout . view _ item _ grid _ n ine _ picture , this , false ) Ġas ĠViewGroup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠimageView Ġ= Ġchild View . findViewById < ImageView >( R . id . iv _ n ine _ image ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠimageView . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Callback ?. image ClickListener ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data [ i ]. endsWith (". mp 4 ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiv Play Ġ= Ġchild View . findViewById < ImageView >( R . id . iv _ play ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiv Play . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( mContext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setDefault RequestOptions ( RequestOptions (). frame ( 1 0 0 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. center Crop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. error ( R . drawable . iv _ image _ error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. placeholder ( R . drawable . iv _ image _ placeholder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( imageView ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( mContext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. load ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. center Crop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. error ( R . drawable . iv _ image _ error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. placeholder ( R . drawable . iv _ image _ placeholder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. into ( imageView ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( child View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" TAG ", Ġ" set ( value ): Ġ============ =") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġthis ( context , Ġnull ) ĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ?) Ġ: Ġthis ( context , Ġattrs , Ġ 0 ) ĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ?, Ġdef Style Attr : ĠInt ) Ġ: Ġsuper ( ĊĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠ Ġattrs , ĊĠĠĠĠĠĠĠ Ġdef Style Attr ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . mContext Ġ= Ġcontext ĊĠĠĠĠĠĠĠ Ġset Will Not Draw ( false ) ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Paint . color Ġ= ĠColor . parse Color ("# a fffffff ") ĊĠĠĠĠĠĠĠ Ġm Paint . style Ġ= ĠPaint . Style . FILL ĊĠĠĠĠĠĠĠ Ġm Text Paint . color Ġ= ĠColor . parse Color ("# 8 a 8 a 8 a ") ĊĠĠĠĠĠĠĠ Ġm Text Paint . style Ġ= ĠPaint . Style . FILL ĊĠĠĠĠĠĠĠ Ġm Text Paint . text Size Ġ= Ġ 5 0 f . dip 2 px ( mContext ). toFloat () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Size Changed ( w : ĠInt , Ġh : ĠInt , Ġold w : ĠInt , Ġold h : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Size Changed ( w , Ġh , Ġold w , Ġold h ) ĊĠĠĠĠĠĠĠ Ġm Width Ġ= Ġw ĊĠĠĠĠĠĠĠ Ġm Height Ġ= Ġh ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Measure ( width Measure Spec , Ġheight Measure Spec ) ĊĠĠĠĠĠĠĠ Ġval Ġwidth Size Ġ= ĠMeasure Spec . getSize ( width Measure Spec ) ĊĠĠĠĠĠĠĠ Ġm ImageView Width Ġ= Ġmeasured Width Ġ/ Ġspan Count ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġchild Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild At Ġ= Ġget Child At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Params Ġ= Ġchild At . layout Params ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params . width Ġ= Ġm ImageView Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params . height Ġ= Ġm ImageView Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild At . layout Params Ġ= Ġlayout Params ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmeasure Children ( width Measure Spec , height Measure Spec ) ĊĠĠĠĠĠĠĠ ĠLog . i (" TAG ", Ġ" on Measure : Ġ") ĊĠĠĠĠĠĠĠ Ġset Measured Dimension ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Size , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( meas ured Width Ġ/ Ġspan Count ) Ġ* Ġceil ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Size Ġ> Ġmax Child ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Child . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Size . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ/ Ġspan Count . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). toInt () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Layout ( changed : ĠBoolean , Ġl : ĠInt , Ġt : ĠInt , Ġr : ĠInt , Ġb : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . i (" TAG ", Ġ" on Layout : Ġ") ĊĠĠĠĠĠĠĠ Ġlayout Image () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlayout Image () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcount Width Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġcount Height Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġchild Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild At Ġ= Ġget Child At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ% Ġspan Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Width Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Height Ġ+= Ġm ImageView Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild At . layout ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Width Ġ+ Ġm ImageView Width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Height Ġ+ Ġm ImageView Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Width Ġ+= Ġm ImageView Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild At . layout ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Width Ġ+ Ġm ImageView Width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Height Ġ+ Ġm ImageView Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect F . set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Width . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Height . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( count Width Ġ+ Ġm ImageView Width ). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( count Height Ġ+ Ġm ImageView Width ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġif Ġ( data Size Ġ- Ġmax Child Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" TAG ", Ġ" on Draw : Ġ============ =") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexceed Count Ġ= Ġdata Size Ġ- Ġmax Child ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbg Layer Ġ= Ġcanvas . save Layer ( rect F , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( rect F , Ġm Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . restore To Count ( bg Layer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Layer Ġ= Ġcanvas . save Layer ( rect F , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdraw Text Content Ġ= Ġ"+ $ ex ceed Count " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Text Content , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( rect F . left Ġ+ Ġ( rect F . right Ġ- Ġrect F . left ) Ġ/ Ġ 2 ) Ġ- Ġm Text Paint . measure Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Text Content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ/ Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( rect F . top Ġ+ Ġ( rect F . bottom Ġ- Ġrect F . top ) Ġ/ Ġ 2 ) Ġ+ Ġ( abs ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Text Paint . as cent () Ġ+ Ġabs ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Text Paint . desc ent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) Ġ/ Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Text Paint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . restore To Count ( text Layer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊ Ċ }