package Ġcom . example . switch button . View Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Typed Array Ċ import Ġandroid . graphics .* Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġcom . example . switch button . R ĊĊ Ċ /** Ċ Ġ* ĠCreated Ġby Ġch en jun yu Ċ Ġ*/ Ċ class ĠSwitch Button View @ Jvm Over loads Ġconstructor ( context : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdef Style Attr : ĠInt Ġ= Ġ 0 ) Ġ: ĠView ( context , attrs , def Style Attr ) Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Paint Ġ: ĠPaint ĊĠĠĠ Ġ// èĥĮæĻ¯ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbitmap Back Ground : ĠBitmap ĊĠĠĠ Ġ// å°ı çĲĥ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbitmap Ball : ĠBitmap ĊĠĠĠ Ġ// åºķ éĥ¨ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbitmap Bottom : ĠBitmap ĊĠĠĠ Ġ// é»ĳ èī² ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbitmap Black : ĠBitmap ĊĠĠĠ Ġ// åıĸ éĩį åı ł éĥ¨åĪĨ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpdf Ġ: ĠPort er D uff X fer mode ĊĠĠĠ Ġ// å¼Ģ åħ³ çĬ¶æĢģ ĊĠĠĠ Ġprivate Ġvar Ġis Checked Ġ: ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ// è§¦ æĳ ¸ X åĿĲæłĩ ĊĠĠĠ Ġprivate Ġvar Ġtouch X : Int Ġ= Ġ 0 ĊĠĠĠ Ġ// å°ı çĲĥ X åĿĲæłĩ ĊĠĠĠ Ġprivate Ġvar Ġball X : Int Ġ= Ġ 0 ĊĊĠĠĠ Ġ// å°ı çĲĥ çļĦ ä¸¤ä¸ª çĬ¶æĢģ ĊĠĠĠ Ġprivate Ġval ĠLEFT _ MO ST : Int Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval ĠRIGHT _ MO ST : Int Ġ= Ġ 1 ĊĠĠĠ Ġ// å°ı çĲĥ è¿Ĳ åĬ¨ çĬ¶æĢģ ĊĠĠĠ Ġprivate Ġvar Ġball Move State Ġ= ĠLEFT _ MO ST ĊĊĠĠĠ Ġ// åĽ¾ å±Ĥ æłĩè¯Ĩ ĊĠĠĠ Ġprivate Ġvar Ġsave Flags Ġ= Ġ 0 ĊĠĠĠ Ġ// switch çļĦ å®½åº¦ ĊĠĠĠ Ġprivate Ġvar Ġswitch Width Ġ= Ġ 0 ĊĠĠĠ Ġ// switch çļĦ é«ĺåº¦ ĊĠĠĠ Ġprivate Ġvar Ġswitch Height Ġ= Ġ 0 ĊĊĠĠĠ Ġ// æīĭ æĮĩ æĮī ä¸ĭ ĊĠĠĠ Ġprivate Ġval ĠTO UCH _ STATE _ DOWN Ġ= Ġ 2 ĊĠĠĠ Ġ// æīĭ æĮĩ ç§»åĬ¨ ĊĠĠĠ Ġprivate Ġval ĠTO UCH _ STATE _ MOVE Ġ= Ġ 3 ĊĠĠĠ Ġ// æīĭ æĮĩ æĬ ¬ èµ· ĊĠĠĠ Ġprivate Ġval ĠTO UCH _ STATE _ UP Ġ= Ġ 4 ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Listener : Ġon Switch Listener ĊĊĠĠĠ Ġinit { ĊĠĠĠĠĠĠĠ Ġval Ġta : Typed Array Ġ Ġ= Ġcontext . obtain Styled Attributes ( attrs , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . style able . Switch Button View ĊĠĠĠĠĠĠĠ Ġ); ĊĠĠĠĠĠĠĠ Ġis Checked Ġ= Ġta . getBoolean ( R . style able . Switch Button View _ checked , Ġfalse ); ĊĠĠĠĠĠĠĠ Ġta . recycle () ĊĠĠĠĠĠĠĠ Ġview Init ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġview Init ( context : Context ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġm Paint Ġ= ĠPaint () ĊĠĠĠĠĠĠĠ Ġm Paint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġpdf Ġ= ĠPort er D uff X fer mode Ġ( Port er D uff . Mode . SRC _ IN ); Ġ// 2 å¼ł éĩį åı ł Ġ åıĸ ä¸ĬéĿ¢ ä¸Ģ å¼ł éĩį åı ł éĥ¨åĪĨ ĊĊĠĠĠĠĠĠĠ Ġsave Flags Ġ= ĠCanvas . ALL _ SAVE _ FLAG ĊĊĠĠĠĠĠĠĠ Ġbitmap Back Ground Ġ= ĠBitmap Factory . decode Resource ( resources , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . mip map . switch _ bg ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġbitmap Ball Ġ= ĠBitmap Factory . decode Resource ( resources , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . mip map . switch _ ball ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġbitmap Bottom Ġ= ĠBitmap Factory . decode Resource ( resources , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . mip map . switch _ bottom ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġbitmap Black Ġ= ĠBitmap Factory . decode Resource ( resources , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . mip map . switch _ black ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// èİ·åıĸ åĽ¾çīĩ å¤§å°ı ĊĠĠĠĠĠĠĠ Ġswitch Width Ġ= Ġbitmap Back Ground . width ĊĠĠĠĠĠĠĠ Ġswitch Height Ġ= Ġbitmap Back Ground . height ĊĠĠĠĠĠĠĠ Ġ// æĺ¯åĲ¦ æīĵå¼Ģ ĊĠĠĠĠĠĠĠ Ġif Ġ( isChecked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġball Move State Ġ= ĠRIGHT _ MO ST ĊĠĠĠĠĠĠĠĠĠĠĠ Ġball X Ġ= Ġbitmap Back Ground . width Ġ- Ġbitmap Ball . width ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Measure ( width Measure Spec , Ġheight Measure Spec ) ĊĠĠĠĠĠĠĠ Ġset Measured Dimension ( switch Width , Ġswitch Height ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġ// å¢ŀåĬł åĽ¾ å±Ĥ ĊĠĠĠĠĠĠĠ Ġcanvas ?. save Layer ( 0 F , Ġ 0 F , Ġswitch Width . toFloat (), Ġswitch Height . toFloat (), Ġnull , Ġsave Flags ) ĊĠĠĠĠĠĠĠ Ġ// åºķ éĥ¨ æĺ¯ é»ĳ èī² åĽ¾ å±Ĥ ĊĠĠĠĠĠĠĠ Ġcanvas ?. draw Bitmap ( bitmap Black , Ġ 0 F , Ġ 0 F , Ġm Paint ) ĊĠĠĠĠĠĠĠ Ġm Paint . xfer mode Ġ= Ġpdf ; ĊĠĠĠĠĠĠĠ Ġif Ġ( isChecked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas ?. draw Bitmap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Bottom , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 F Ġ- Ġ( switch Width Ġ- Ġbitmap Ball . width Ġ- Ġball X ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 F , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Paint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas ?. draw Bitmap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Bottom , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-( bitmap Bottom . width Ġ/ Ġ 2 Ġ- Ġbitmap Ball . width Ġ/ Ġ 2 ). toFloat () Ġ+ Ġball X , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 F , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Paint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Paint . xfer mode Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcanvas ?. restore () ĊĠĠĠĠĠĠĠ Ġball Move State ( canvas ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ » ĳ åĬ¨ çĬ¶æĢģ ç»ĺ åĪ¶ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcanvas ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġball Move State ( canvas : Canvas ?) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( ball Move State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTO UCH _ STATE _ DOWN Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTO UCH _ STATE _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( touch X Ġ> Ġ 0 Ġ&& Ġtouch X Ġ< Ġswitch Width Ġ- Ġbitmap Ball . width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas ?. draw Bitmap ( bitmap Ball , Ġtouch X . toFloat (), Ġ 0 F , Ġm Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( touch X Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas ?. draw Bitmap ( bitmap Ball , Ġ 0 F , Ġ 0 F , Ġm Paint ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( touch X Ġ>= Ġswitch Width Ġ- Ġbitmap Ball . width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas ?. draw Bitmap ( bitmap Ball , Ġswitch Width Ġ- Ġbitmap Ball . width . toFloat (), Ġ 0 F , Ġm Paint ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTO UCH _ STATE _ UP Ġ-> Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLEFT _ MO ST Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( touch X Ġ> Ġ 0 Ġ&& Ġtouch X Ġ< Ġswitch Width Ġ/ Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas ?. draw Bitmap ( bitmap Ball , Ġ 0 F , Ġ 0 F , Ġm Paint ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( touch X Ġ>= Ġswitch Width Ġ/ Ġ 2 Ġ&& Ġtouch X Ġ<= Ġswitch Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas ?. draw Bitmap ( bitmap Ball , Ġswitch Width Ġ- Ġbitmap Ball . width . toFloat (), Ġ 0 F , Ġm Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( touch X Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas ?. draw Bitmap ( bitmap Ball , Ġ 0 F , Ġ 0 F , Ġm Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( touch X Ġ>= Ġswitch Width Ġ- Ġbitmap Ball . width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas ?. draw Bitmap ( bitmap Ball , Ġswitch Width Ġ- Ġbitmap Ball . width . toFloat (), Ġ 0 F , Ġm Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRIGHT _ MO ST Ġ-> Ġcanvas ?. draw Bitmap ( bitmap Ball , Ġswitch Width Ġ- Ġbitmap Ball . width . toFloat (), Ġ 0 F , Ġm Paint ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( event ?. action ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġtouch StateChange ( event . x . toInt (), ĠTO UCH _ STATE _ DOWN ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġtouch StateChange ( event . x . toInt (), ĠTO UCH _ STATE _ MOVE ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġtouch StateChange ( event . x . toInt (), ĠTO UCH _ STATE _ UP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è§¦ æĳ ¸ çĬ¶æĢģ æĶ¹åıĺ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġm Touch X ĊĠĠĠĠ Ġ* Ġ@ param Ġtouch State ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġtouch StateChange ( m Touch X : ĠInt , Ġtouch State : Int ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġ// æīĭ æĮĩ çļĦ ä½įç½® å°±æĺ¯ å°ı çĲĥ çļĦ ä½įç½® ĊĠĠĠĠĠĠĠ Ġtouch X Ġ= Ġm Touch X ĊĠĠĠĠĠĠĠ Ġball X Ġ= Ġtouch X ĊĠĠĠĠĠĠĠ Ġif Ġ( touch X Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġball X Ġ= Ġ 0 ; ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( touch X Ġ>= Ġswitch Width Ġ- Ġbitmap Ball . width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġball X Ġ= Ġswitch Width Ġ- Ġbitmap Ball . width ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġball Move State Ġ= Ġtouch State ; ĊĠĠĠĠĠĠĠ Ġif Ġ( ball Move State Ġ== ĠTO UCH _ STATE _ UP ) Ġ{ Ġ// æīĭ æĮĩ æĬ ¬ èµ· ĊĠĠĠĠĠĠĠĠĠĠĠ Ġball X Ġ= Ġ 0 ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( touch X Ġ>= Ġswitch Width Ġ/ Ġ 2 f ) Ġ{// æľĢ åı³ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Checked Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġball X Ġ= Ġswitch Width Ġ- Ġbitmap Ball . width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġball Move State Ġ= ĠRIGHT _ MO ST ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{// æľĢ å·¦ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Checked Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġball Move State Ġ= ĠLEFT _ MO ST ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Listener ?. on Switch Changed ( isChecked ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠ Ġè¯·æ±Ĥ éĩį ç»ĺ View æłĳ . åį³ draw () è¿ĩç¨ĭ . åģĩ å¦Ĥ è§ĨåĽ¾ åıĳçĶŁ å¤§å°ı æ²¡æľī åıĺåĮĸ å°± ä¸įä¼ļ è°ĥçĶ¨ layout () è¿ĩç¨ĭ ï¼Į å¹¶ä¸Ķ åıª ç»ĺ åĪ¶ éĤ£ äºĽ âĢľ éľĢè¦ģ éĩį ç»ĺ çļĦ âĢĿ ĊĠĠĠĠĠĠĠĠ Ġ è§ĨåĽ¾ ï¼Į åį³ è° ģ ( View çļĦè¯Ŀ ï¼Į åıª ç»ĺ åĪ¶ è¯¥ View . ViewGroup ï¼Į åĪĻ ç»ĺ åĪ¶ æķ´ä¸ª ViewGroup ) è¯·æ±Ĥ invalidate () æĸ¹æ³ķ ï¼Į å°± ç»ĺ åĪ¶ è¯¥ è§ĨåĽ¾ ãĢĤ ĊĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset On Switch Listener ( listener : Ġon Switch Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Listener Ġ= Ġlistener ĊĠĠĠ Ġ} Ċ }