// ĠCreated Ġby Ġq ini u Ġon Ġ 2 0 2 1 / 4 / 2 6 . Ċ Ċ package Ġcom . q ini u . white board . example Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Color State List Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . drawable . Color Drawable Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Popup Window Ċ import Ġandroidx . core . view . isNotEmpty Ċ import Ġandroidx . core . view . set Margins Ċ import Ġcom . google . android . material . chip . Chip Ċ import Ġcom . google . android . material . chip . Chip Group Ċ import Ġcom . q ini u . white board . example . databinding . Popup Card Binding Ċ import Ġsplit ties . dimensions . dip Ċ Ċ /** Ċ Ġ* Ġ éĢļ çĶ¨ è°ĥ èī² çĽĺ å¼¹ çªĹ ï¼Į éĢīæĭ© é¢ľèī² åĴĮ å¤§å°ı Ċ Ġ*/ Ċ class ĠPalette Popup ( private Ġval Ġcontext : ĠContext ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æł¹ å¸ĥå±Ģ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġparent : ĠViewGroup ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¼¹ çªĹ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġpopup Window : ĠPopup Window ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbinding Ġ= ĠPopup Card Binding . inflate ( LayoutInflater . from ( context )) ĊĠĠĠĠĠĠĠ Ġparent Ġ= Ġbinding . popup Parent ĊĠĠĠĠĠĠĠ Ġpopup Window Ġ= ĠPopup Window ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . root , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams . WRAP _ CONTENT , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams . WRAP _ CONTENT , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Touchable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Outside Touchable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Background Drawable ( Color Drawable ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¢ŀåĬł é¢ľèī² éĢīæĭ© éĿ¢ æĿ¿ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcolors Ġ å¾ħ éĢī é¢ľèī² ĊĠĠĠĠ Ġ* Ġ@ param Ġselected Ġ åĪĿå§ĭ éĢī ä¸ŃçļĦ åºı åı· ĊĠĠĠĠ Ġ* Ġ@ param Ġchanged Listener Ġ é¢ľèī² éĢīæĭ© äºĭä»¶ åıĤæķ° ä¸º éĢī ä¸Ń åºı åı· ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Color Selection ( ĊĠĠĠĠĠĠĠ Ġcolors : ĠInt Array , ĊĠĠĠĠĠĠĠ Ġselected : ĠInt , ĊĠĠĠĠĠĠĠ Ġchanged Listener : Ġ( selected : ĠInt ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġload Chip Group (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolors . forEach Indexed Ġ{ Ġindex , Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Chip ( this ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchip Icon Tint Ġ= ĠColor State List . valueOf ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( selected ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Checked ChangeListener Ġ{ Ġ_, Ġchecked Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Listener ( checked Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¢ŀåĬł å¤§å°ı éĢīæĭ© éĿ¢ æĿ¿ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġsizes Ġ å¾ħ éĢī å¤§å°ı ĊĠĠĠĠ Ġ* Ġ@ param Ġselected Ġ åĪĿå§ĭ éĢī ä¸ŃçļĦ åºı åı· ĊĠĠĠĠ Ġ* Ġ@ param Ġchanged Listener Ġ å¤§å°ı éĢīæĭ© äºĭä»¶ åıĤæķ° ä¸º éĢī ä¸Ń åºı åı· ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Size Selection ( ĊĠĠĠĠĠĠĠ Ġsizes : ĠFloat Array , ĊĠĠĠĠĠĠĠ Ġselected : ĠInt , ĊĠĠĠĠĠĠĠ Ġchanged Listener : Ġ( selected : ĠInt ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġload Chip Group (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmin Size Ġ= Ġcontext . dip ( 1 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweight Ġ= Ġcontext . dip ( 1 6 ). toFloat () Ġ/ Ġsizes . size ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsizes . forEach Indexed Ġ{ Ġindex , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Chip ( this ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchip Icon Size Ġ= Ġweight Ġ* Ġindex Ġ+ Ġmin Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( selected ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Checked ChangeListener Ġ{ Ġ_, Ġchecked Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Listener ( checked Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¢ŀåĬł åĽ¾ å½¢ éĢīæĭ© éĿ¢ æĿ¿ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġicons Ġ å¾ħ éĢī åĽ¾ å½¢ ĊĠĠĠĠ Ġ* Ġ@ param Ġselected Ġ åĪĿå§ĭ éĢī ä¸ŃçļĦ åĽ¾ å½¢ èµĦæºĲ id ĊĠĠĠĠ Ġ* Ġ@ param Ġchanged Listener Ġ åĽ¾ å½¢ éĢīæĭ© äºĭä»¶ åıĤæķ° ä¸º éĢī ä¸ŃçļĦ åĽ¾ å½¢ èµĦæºĲ id ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Icon Selection ( icons : ĠSet < Int >, Ġselected : ĠInt , Ġchanged Listener : Ġ( selected : ĠInt ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġload Chip Group (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġicons . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Chip ( this ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Chip Icon Resource ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( selected ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Checked ChangeListener Ġ{ Ġ_, Ġchecked Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Listener ( checked Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æĺ¾ç¤º å¼¹ çªĹ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġanchor Ġ éĶ ļ çĤ¹ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġshow ( anchor : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpopup Window . show As DropDown ( anchor , Ġ 0 , Ġcontext . dip ( 8 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åĬłè½½ ä¸Ģä¸ª [ Chip Group ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġload Chip Group (): ĠCh ip Group Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( parent . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . addView ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView ( context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset BackgroundColor ( Color . DK GRAY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . Margin LayoutParams ( ViewGroup . LayoutParams . MATCH _ PARENT , Ġcontext . dip ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Margins ( context . dip ( 8 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠLayoutInflater . from ( context ). inflate ( R . layout . palette _ chip _ group , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent . addView ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġas ĠCh ip Group ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åĬłè½½ ä¸Ģä¸ª [ Chip ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġload Chip ( root : ĠViewGroup ): ĠCh ip Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠLayoutInflater . from ( context ). inflate ( R . layout . palette _ chip , Ġroot , Ġfalse ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot . addView ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġas ĠCh ip ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }