package Ġcom . example . p 2 p . widget . custom View Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Matrix Ċ import Ġandroid . graphics . Rect F Ċ import Ġandroid . graphics . drawable . Anim atable Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . net . Uri Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view .* Ċ import Ġandroid . widget . Over Scroller Ċ import Ġandroidx . appcompat . widget . AppCompat ImageView Ċ import Ġjava . io . File Ċ import Ġjava . lang . IllegalArgumentException Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . round ToInt Ċ import Ġkotlin . math . sqrt Ċ Ċ /** Ċ Ġ* Ġåı¯ èĩªçĶ± ç¼© æĶ¾ çļĦ åĽ¾çīĩ æİ§ä»¶ Ċ Ġ* Ġä½¿çĶ¨ Scale Gesture Detector çĽĳåĲ¬ ç¼© æĶ¾ æīĭ åĬ¿ Ċ Ġ* Ġä½¿çĶ¨ Gesture Detector çĽĳåĲ¬ åıĮ åĩ» ãĢģ åįķ åĩ» ãĢģ fl ing æīĭ åĬ¿ Ċ Ġ* ĠCreate Ġby Ġ éĻĪ åģ ¥ å® ĩ Ġat Ġ 2 0 2 0 / 5 / 3 1 Ċ Ġ*/ Ċ class ĠZoom ImageView Ġ@ Jvm Over loads Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ? Ġ= Ġnull , Ġdef Attrs : ĠInt Ġ= Ġ 0 ) Ġ: ĠAppCompat ImageView ( context , Ġattrs , Ġdef Attrs ), ĊĠĠĠĠĠĠĠ ĠView . On Layout ChangeListener , ĊĠĠĠĠĠĠĠ ĠView . On Touch Listener Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠED GE _ NONE Ġ= Ġ 0 x 0 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠED GE _ BOTH Ġ= Ġ 0 x 0 0 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠED GE _ RIGHT Ġ= Ġ 0 x 0 0 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠED GE _ LEFT Ġ= Ġ 0 x 0 0 3 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMIN _ SCALE Ġ= Ġ 1 . 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ SCALE Ġ= Ġ 3 . 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAUTO _ SCALE _ INTERVAL Ġ= Ġ 1 0 L ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAUTO _ FL ING _ INTERVAL Ġ= Ġ 1 5 L ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSC ALE _ BIG GER Ġ= Ġ 1 . 0 7 f ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSC ALE _ SMALL ER Ġ= Ġ 0 . 9 3 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠZoom ImageView :: class . java . simple Name ĊĠĠĠ Ġprivate Ġval Ġm Temp Matrix Values Ġ= ĠFloat Array ( 9 ) ĊĠĠĠ Ġprivate Ġval Ġm Temp Image Matrix Ġ= ĠMatrix () ĊĠĠĠ Ġprivate Ġval Ġm Temp Rect Ġ= ĠRect F () ĊĠĠĠ Ġprivate Ġval Ġm Init Matrix Ġ= ĠMatrix () // åĽ¾çīĩ çļĦ åĪĿå§ĭ çŁ©éĺµ ĊĠĠĠ Ġprivate Ġval Ġm Shape Matrix Ġ= ĠMatrix () // æİ§åĪ¶ åĽ¾çīĩ ä½įç½® åĴĮ å¤§å°ı çļĦ çŁ©éĺµ ĊĠĠĠ Ġprivate Ġvar Ġm Image Edge Ġ= ĠED GE _ BOTH Ġ// çĶ¨äºİ åĪ¤æĸŃ åĽ¾çīĩ æĺ¯åĲ¦ åĪ° è¾¾ çĪ¶ å®¹åĻ¨ çļĦ å·¦ åı³ è¾¹ çķĮ ĊĠĠĠ Ġprivate Ġvar Ġm Scaled Touch S lop Ġ= ĠView Configuration . get ( context ). scaled Touch S lop . toFloat () ĊĠĠĠ Ġprivate Ġvar Ġm Min Fl ing Velocity Ġ= ĠView Configuration . get ( context ). scaled Minimum Fl ing Velocity . toFloat () ĊĠĠĠ Ġprivate Ġval Ġm Support Scale Types Ġ= ĠarrayOf ( Scale Type . CENTER _ INS IDE , ĠScale Type . FIT _ CENTER ) ĊĠĠĠ Ġprivate Ġvar Ġm Scale Type Ġ= ĠScale Type . FIT _ CENTER ĊĠĠĠ Ġprivate Ġvar Ġm Scale Gesture Detector : ĠScale Gesture Detector ĊĠĠĠ Ġprivate Ġvar Ġm Gesture Detector : ĠGest ure Detector ĊĠĠĠ Ġprivate Ġvar Ġm Fl ing Scroller Ġ= ĠOver Scroller ( context ) ĊĠĠĠ Ġprivate Ġvar Ġm OnClickListener : ĠOn ClickListener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġis Dragging Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġis Scaling Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġis Fl ing Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġm Last X Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Last Y Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Last Pointer Count Ġ= Ġ 0 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġscale Type Ġ= ĠScale Type . MATRIX ĊĊĠĠĠĠĠĠĠ Ġset On Touch Listener ( this ) ĊĠĠĠĠĠĠĠ Ġadd On Layout ChangeListener ( this ) ĊĊĠĠĠĠĠĠĠ Ġm Scale Gesture Detector Ġ= ĠScale Gesture Detector ( context , Ġobject Ġ: ĠScale Gesture Detector . On Scale Gesture Listener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ è¿ĻéĩĮ è¿Ľè¡Į åĽ¾çīĩ çļĦ ç¼© æĶ¾ ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scale ( detector : ĠScale Gesture Detector ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( drawable Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcur Image Scale Ġ= Ġcur Image Scale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġscale Factor Ġ= Ġdetector . scale Factor ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( scale Factor Ġ> Ġ 1 . 0 f ){ // æŃ£åľ¨ æĶ¾ å¤§ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( scale Factor Ġ* Ġcur Image Scale Ġ> ĠMAX _ SCALE ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Factor Ġ= ĠMAX _ SCALE Ġ/ Ġcur Image Scale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( scale Factor Ġ< Ġ 1 . 0 f ){ // æŃ£åľ¨ ç¼© å°ı ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( scale Factor Ġ* Ġcur Image Scale Ġ< ĠMIN _ SCALE ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Factor Ġ= ĠMIN _ SCALE Ġ/ Ġcur Image Scale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è®¾ç½® ç¼© æĶ¾ æ¯Ķ ä¾ĭ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Shape Matrix . post Scale ( scale Factor , Ġscale Factor , Ġdetector . focus X , Ġdetector . focus Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck AndUpdate Image Matrix () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scale Begin ( detector : ĠScale Gesture Detector ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Scaling Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scale End ( detector : ĠScale Gesture Detector ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Scaling Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġm Gesture Detector Ġ= ĠGest ure Detector ( context , Ġobject Ġ: ĠGest ure Detector . Simple On Gesture Listener () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġon Single Tap Confirmed åĴĮ on Double Tap åıª ä¼ļ åĽŀè°ĥ ä¸Ģä¸ª ï¼Į åį³ åıĮ åĩ» çļĦ åĲĮæĹ¶ ä¸įä¼ļ è§¦åıĳ ä¸¤ æ¬¡ åįķ åĩ» äºĭä»¶ ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Single Tap Confirmed ( e : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm OnClickListener ?. onClick ( this @ Zoom ImageView ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġis Point In Image Display Rect ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Double Tap ( e : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Scaling ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cur Image Scale Ġ< ĠMAX _ SCALE ) Ġ{// æĶ¾ å¤§ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Scaling Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Delayed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuto Scale Runnable ( MAX _ SCALE , Ġe . x , Ġe . y ), ĠAUTO _ SCALE _ INTERVAL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// ç¼© å°ı ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Scaling Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Delayed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuto Scale Runnable ( MIN _ SCALE , Ġe . x , Ġe . y ), ĠAUTO _ SCALE _ INTERVAL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Fl ing ( e 1 : ĠMotion Event , Ġe 2 : ĠMotion Event , Ġvelocity X : ĠFloat , Ġvelocity Y : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Fl ing ( e 1 , Ġe 2 , Ġvelocity X , Ġvelocity Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( velocity X ). coerce At Most ( abs ( velocity Y )) Ġ>= Ġm Min Fl ing Velocity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Fl ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Delayed ( Auto Fl ing Runnable ( velocity X , Ġvelocity Y ), ĠAUTO _ FL ING _ INTERVAL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è¿ĻéĩĮ è¿Ľè¡Į åĽ¾çīĩ çļĦ åĪĿå§ĭåĮĸ ï¼Į å±ħ ä¸Ń åĽ¾çīĩ ï¼Į on Size Changed ä¼ļ åľ¨ on Layout åĲİ åĽŀè°ĥ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ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 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( w Ġ!= Ġold w Ġ|| Ġh Ġ!= Ġold h ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Image Matrix ( drawable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå½ĵåīį æİ§ä»¶ çļĦ è¾¹ çķĮ åĿĲæłĩ æĶ¹åıĺ æĹ¶ ï¼Į ä¼ļ è°ĥçĶ¨ ï¼Į æŃ¤ æĹ¶ è¦ģ éĩį ç½® åĽ¾çīĩ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Layout Change ( v : ĠView , Ġleft : ĠInt , Ġtop : ĠInt , Ġright : ĠInt , Ġbottom : ĠInt , Ġold Left : ĠInt , Ġold Top : ĠInt , Ġold Right : ĠInt , Ġold Bottom : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( left Ġ!= Ġold Left Ġ|| Ġright Ġ!= Ġold Right Ġ|| Ġbottom Ġ!= Ġold Bottom Ġ|| Ġtop Ġ!= Ġold Top ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Image Matrix ( drawable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è¿ĻéĩĮ è¿Ľè¡Į å¤ļ çĤ¹ è§¦ æĳ ¸ åĪ¤æĸŃ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Touch ( v : ĠView , Ġevent : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( drawable Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// æĬĬ äºĭä»¶ åĪĨ åıĳ ç»Ļ ç»Ļ Gesture Detector å¤ĦçĲĨ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Gesture Detector . on Touch Event ( event )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// æĬĬ äºĭä»¶ äº¤ ç»Ļ Scale Gesture Detector å¤ĦçĲĨ ĊĠĠĠĠĠĠĠ Ġm Scale Gesture Detector . on Touch Event ( event ) ĊĊĠĠĠĠĠĠĠ Ġ// å¤ĦçĲĨ åĽ¾çīĩ ç§»åĬ¨ ĊĠĠĠĠĠĠĠ Ġreturn Ġhandle Move ( event , Ġv ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detached From Window () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Detached From Window () ĊĠĠĠĠĠĠĠ Ġremove On Layout ChangeListener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Image Drawable ( drawable : ĠDrawable ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . setImage Drawable ( drawable ) ĊĠĠĠĠĠĠĠ Ġinit Image Matrix ( drawable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Image Resource ( res Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . setImage Resource ( res Id ) ĊĠĠĠĠĠĠĠ Ġinit Image Matrix ( drawable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Image URI ( uri : ĠUri ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . setImage URI ( uri ) ĊĠĠĠĠĠĠĠ Ġinit Image Matrix ( drawable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset OnClickListener ( l : ĠOn ClickListener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm OnClickListener Ġ= Ġl ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġè®¾ç½® Scale Type ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Image Scale Type ( type : ĠScale Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif (! m Support Scale Types . contains ( type )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" un Support ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif ( type Ġ!= Ġm Scale Type ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Scale Type Ġ= Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Image Matrix ( drawable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¤ĦçĲĨ åĽ¾çīĩ çļĦ æ»ĳ åĬ¨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhandle Move ( event : ĠMotion Event , Ġv : ĠView ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġhandle Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġtouch X Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġtouch Y Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ// æĭ¿ åĪ° è§¦ æĳ ¸ çĤ¹ ä¸ªæķ° ĊĠĠĠĠĠĠĠ Ġval Ġpointer Count Ġ= Ġevent . pointer Count ĊĠĠĠĠĠĠĠ Ġ// è®¡ç®Ĺ åĩº æ¯ıä¸ª è§¦ æĳ ¸ çĤ¹ x ï¼Į y åĿĲæłĩ çļĦ å¹³åĿĩ åĢ¼ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġpointer Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtouch X Ġ+= Ġevent . getX ( i ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Y Ġ+= Ġevent . getY ( i ). toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtouch X Ġ/= Ġpointer Count ĊĠĠĠĠĠĠĠ Ġtouch Y Ġ/= Ġpointer Count ĊĊĠĠĠĠĠĠĠ Ġ// æ¯ı å½ĵ è§¦ æĳ ¸ çĤ¹ åıĳçĶŁ åıĺåĮĸ æĹ¶ ï¼Į éĩį ç½® m L as X Ġ, Ġm Last Y ĊĠĠĠĠĠĠĠ Ġif Ġ( m Last Pointer Count Ġ!= Ġpointer Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Last X Ġ= Ġtouch X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Last Y Ġ= Ġtouch Y ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Last Pointer Count Ġ= Ġpointer Count ĊĊĠĠĠĠĠĠĠ Ġ// è¿Ľè¡Į å¹³ ç§» åĽ¾çīĩ ĊĠĠĠĠĠĠĠ Ġval Ġparent : ĠView Parent ? ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// é¦ĸåħĪ çĪ¶ å®¹åĻ¨ ä¸įèĥ½ æĭ ¦ æĪª æİ¥ ä¸ĭ æĿ¥çļĦ äºĭä»¶ ï¼Į åŃĲ æİ§ä»¶ è¦ģ æ¶Ī èĢĹ ACTION _ DOWN äºĭä»¶ ï¼Į è¿Ļæł· æīįèĥ½ ä¿Ŀè¯ģ æİ¥ ä¸ĭ æĿ¥ åŃĲ æİ§ä»¶ èĥ½ æĶ¶ åĪ° äºĭä»¶ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġv . parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent ?. request Dis allow Intercept Touch Event ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Fl ing Scroller . abort Animation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Fl ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ CANCEL , ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è§¦ æĳ ¸ çĤ¹ æķ° ç½® éĽ¶ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Last Pointer Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Dragging Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd X Ġ= Ġtouch X Ġ- Ġm Last X . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Y Ġ= Ġtouch Y Ġ- Ġm Last Y . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Dragging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Dragging Ġ= Ġsqrt ( dX Ġ* Ġd X Ġ+ Ġd Y Ġ* Ġd Y . toDouble ()) Ġ>= Ġm Scaled Touch S lop Ġ// åĪ¤æĸŃ çĶ¨æĪ· æĺ¯åĲ¦ åľ¨ æĭ ĸ åĬ¨ åĽ¾çīĩ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Dragging Ġ&& Ġ! is Scaling Ġ&& Ġ! is Fl ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Shape Matrix . post Translate ( dX , Ġd Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck AndUpdate Image Matrix () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= ĠgetParent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// åĪ¤æĸŃ åĽ¾çīĩ æĺ¯åĲ¦ æĭ ĸ åĬ¨ åĪ° çĪ¶ å®¹åĻ¨ è¾¹ çķĮ ï¼Į å¦Ĥæŀľ æĺ¯ ï¼Į æĬĬ ä¸ĭ ä¸Ģä¸ª äºĭä»¶ äº¤ ç»Ļ çĪ¶ å®¹åĻ¨ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Image Edge Ġ== ĠED GE _ BOTH Ġ|| Ġm Image Edge Ġ== ĠED GE _ RIGHT Ġ&& Ġd X Ġ<= Ġ- 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġm Image Edge Ġ== ĠED GE _ LEFT Ġ&& Ġd X Ġ>= Ġ 1 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent ?. request Dis allow Intercept Touch Event ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent ?. request Dis allow Intercept Touch Event ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Last X Ġ= Ġtouch X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Last Y Ġ= Ġtouch Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġhandle ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠåĪ¤æĸŃ è§¦ æĳ ¸ çĤ¹ æĺ¯åĲ¦ åľ¨ åĽ¾çīĩ çļĦ æĺ¾ç¤º èĮĥåĽ´ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Point In Image Display Rect ( e : ĠMotion Event ): ĠBoolean { ĊĠĠĠĠĠĠĠ Ġval Ġdisplay Rect Ġ= Ġimage Display Rect ĊĠĠĠĠĠĠĠ Ġreturn Ġdisplay Rect . contains ( e . x , Ġe . y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ£Ģ æŁ¥ è¾¹ çķĮ å¹¶ è®¾ç½® åĽ¾çīĩ çļĦ Matrix ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcheck AndUpdate Image Matrix () Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Image Bounds () ĊĠĠĠĠĠĠĠ Ġupdate Image Matrix () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġåľ¨ ç¼© æĶ¾ åĴĮ æĭ ĸ åĬ¨ æĹ¶ ï¼Į è¿Ľè¡Į åĽ¾çīĩ æĺ¾ç¤º èĮĥåĽ´ çļĦ æİ§åĪ¶ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcheck Image Bounds () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrect Ġ= Ġimage Display Rect ĊĠĠĠĠĠĠĠ Ġvar Ġdelta X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġdelta Y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġview Width ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġview Height ĊĠĠĠĠĠĠĠ Ġ// å¦Ĥæŀľ åĽ¾çīĩ ç¼© æĶ¾ çļĦ å®½ æĪĸ é«ĺ å°ı äºİ å±ı å¹ķ ï¼Į åĪĻ è®© åħ¶ å±ħ ä¸Ń ĊĠĠĠĠĠĠĠ Ġif Ġ( rect . width () Ġ< Ġwidth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Image Edge Ġ= ĠED GE _ BOTH ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelta X Ġ= Ġwidth Ġ* Ġ 0 . 5 f Ġ- Ġrect . right Ġ+ Ġ 0 . 5 f Ġ* Ġrect . width () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( rect . height () Ġ< Ġheight ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelta Y Ġ= Ġheight Ġ* Ġ 0 . 5 f Ġ- Ġrect . bottom Ġ+ Ġ 0 . 5 f Ġ* Ġrect . height () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// å¦Ĥæŀľ åĽ¾çīĩ ç¼© æĶ¾ çļĦ å®½ æĪĸ é«ĺ å¤§äºİ å±ı å¹ķ ï¼Į åĪĻ æİ§åĪ¶ èĮĥåĽ´ ï¼Į åĵª éĩĮ æľī ç©º éļ Ļ å°± å¾Ģ åĵª è¾¹ ç§»åĬ¨ ĊĠĠĠĠĠĠĠ Ġif Ġ( rect . width () Ġ>= Ġwidth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Image Edge Ġ= ĠED GE _ NONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rect . left Ġ> Ġ 0 ) Ġ{ Ġ// å¦Ĥæŀľ å·¦ è¾¹ æľī ç©º éļ Ļ ï¼Į å·¦ ç§» ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Image Edge Ġ= ĠED GE _ LEFT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelta X Ġ= Ġ- rect . left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rect . right Ġ< Ġwidth ) Ġ{ Ġ// å¦Ĥæŀľ åı³ è¾¹ æľī ç©º éļ Ļ ï¼Į åı³ ç§» ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Image Edge Ġ= ĠED GE _ RIGHT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelta X Ġ= Ġwidth Ġ- Ġrect . right ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( rect . height () Ġ>= Ġheight ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rect . top Ġ> Ġ 0 ) Ġ{ Ġ// å¦Ĥæŀľ é¡¶ éĥ¨ æľī ç©º éļ Ļ ï¼Į ä¸Ĭ ç§» ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelta Y Ġ= Ġ- rect . top ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rect . bottom Ġ< Ġheight ) Ġ{ Ġ// å¦Ĥæŀľ åºķ éĥ¨ æľī ç©º éļ Ļ ï¼Į ä¸ĭ ç§» ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelta Y Ġ= Ġheight Ġ- Ġrect . bottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Shape Matrix . post Translate ( delta X , Ġdelta Y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠåĪĿå§ĭåĮĸ åĽ¾çīĩ çŁ©éĺµ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinit Image Matrix ( drawable : ĠDrawable ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( drawable Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Init Matrix . reset () ĊĠĠĠĠĠĠĠ Ġval Ġimage Width Ġ= Ġdrawable . intrinsic Width ĊĠĠĠĠĠĠĠ Ġval Ġimage Height Ġ= Ġdrawable . intrinsic Height ĊĠĠĠĠĠĠĠ Ġval Ġwidth Scale Ġ= Ġview Width Ġ/ Ġimage Width . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġheight Scale Ġ= Ġview Width Ġ/ Ġimage Height . toFloat () ĊĠĠĠĠĠĠĠ Ġwhen ( m Scale Type ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScale Type . CENTER _ INS IDE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġ 1 . 0 f . coerce At Most ( width Scale . coerce At Most ( height Scale )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// åĽ¾çīĩ ç§»åĬ¨ åĪ° ä¸Ńå¿ĥ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Init Matrix . post Translate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( view Width Ġ- Ġimage Width ) Ġ/ Ġ 2 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( view Height Ġ- Ġimage Height ) Ġ/ Ġ 2 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// çŃī æ¯Ķ ä¾ĭ ç¼© æĶ¾ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Init Matrix . post Scale ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale , Ġscale , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Width Ġ/ Ġ 2 f , Ġview Height / Ġ 2 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Src Rect Ġ= ĠRect F ( 0 f , Ġ 0 f , Ġimage Width . toFloat (), Ġimage Height . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Dst Rect Ġ= ĠRect F ( 0 f , Ġ 0 f , Ġview Width . toFloat (), Ġview Height . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Init Matrix . set Rect To Rect ( m Src Rect , Ġm Dst Rect , ĠMatrix . Scale To Fit . CENTER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreset Image Matrix () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éĩį ç½® åĽ¾çīĩ çŁ©éĺµ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġreset Image Matrix (){ ĊĠĠĠĠĠĠĠ Ġm Shape Matrix . reset () ĊĠĠĠĠĠĠĠ Ġupdate Image Matrix () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠæĽ´æĸ° åĽ¾çīĩ çŁ©éĺµ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate Image Matrix (){ ĊĠĠĠĠĠĠĠ Ġimage Matrix Ġ= Ġget Temp Image Matrix () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ è¿ĺ æľª è®¾ç½® åīį çļĦ åĽ¾çīĩ çŁ©éĺµ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Temp Image Matrix (): ĠMatrix { ĊĠĠĠĠĠĠĠ Ġm Temp Image Matrix . set ( m Init Matrix ) ĊĠĠĠĠĠĠĠ Ġm Temp Image Matrix . post Concat ( m Shape Matrix ) ĊĠĠĠĠĠĠĠ Ġreturn Ġm Temp Image Matrix ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæł¹æį® å½ĵåīį åĽ¾çīĩ çļĦ Matrix èİ·å¾Ĺ åĽ¾çīĩ çļĦ æĺ¾ç¤º èĮĥåĽ´ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġimage Display Rect : ĠRect F ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Ġ= Ġdrawable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġd ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Temp Rect . set ( 0 f , Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd . intrinsic Width . toFloat (), Ġd . intrinsic Height . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Temp Image Matrix (). map Rect ( m Temp Rect ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm Temp Rect ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ èİ·å¾Ĺ å½ĵåīį åĽ¾çīĩ çļĦ ç¼© æĶ¾ æ¯Ķ ä¾ĭ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġcur Image Scale : ĠFloat ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Shape Matrix . getValues ( m Temp Matrix Values ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm Temp Matrix Values [ Matrix . M SCALE _ X ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è§ĨåĽ¾ çļĦ å®½ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġview Width : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwidth Ġ- Ġpadding Left Ġ- Ġpadding Right ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è§ĨåĽ¾ çļĦ é«ĺ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġview Height : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġheight Ġ- Ġpadding Bottom Ġ- Ġpadding Top ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġfl ing æĹ¶ å¤ĦçĲĨ åĽ¾çīĩ ç§»åĬ¨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġinner Ġclass ĠAuto Fl ing Runnable ( velocity X : ĠFloat , Ġvelocity Y : ĠFloat ) Ġ: ĠRunnable Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm Last X Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm Last Y Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdisplay Rect Ġ= Ġimage Display Rect ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Width Ġ= Ġdisplay Rect . width (). round ToInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Height Ġ= Ġdisplay Rect . height (). round ToInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Width Ġ= Ġwidth ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Height Ġ= Ġheight ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv X Ġ= Ġvelocity X . round ToInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Y Ġ= Ġvelocity Y . round ToInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart X Ġ= Ġ- display Rect . left . round ToInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Y Ġ= Ġ- display Rect . top . round ToInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmin X Ġ= Ġstart X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmax X Ġ= Ġstart X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmin Y Ġ= Ġstart Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmax Y Ġ= Ġstart Y ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( image Width Ġ> Ġview Width ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin X Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax X Ġ= Ġimage Width Ġ- Ġview Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( image Height Ġ> Ġview Height ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Y Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Y Ġ= Ġimage Height Ġ- Ġview Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// å½ĵ åĽ¾çīĩ é«ĺ æĪĸ å®½ å¤§äºİ è§ĨåĽ¾ çļĦ æĺ¾ç¤º èĮĥåĽ´ æĹ¶ æīįèĥ½ fl ing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start X Ġ!= Ġmax X Ġ|| Ġstart Y Ġ!= Ġmax Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Fl ing Scroller . fl ing ( start X , Ġstart Y , Ġv X , Ġv Y , Ġmin X , Ġmax X , Ġmin Y , Ġmax Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Last X Ġ= Ġstart X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Last Y Ġ= Ġstart Y ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Fl ing Scroller . is Finished ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Fl ing Scroller . compute Scroll Offset ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcur X Ġ= Ġm Fl ing Scroller . curr X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcur Y Ġ= Ġm Fl ing Scroller . curr Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd X Ġ= Ġcur X Ġ- Ġm Last X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Y Ġ= Ġcur Y Ġ- Ġm Last Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Shape Matrix . post Translate ( dX . toFloat (), Ġd Y . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck AndUpdate Image Matrix () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Last X Ġ= Ġcur X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Last Y Ġ= Ġcur Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Delayed ( this , ĠAUTO _ FL ING _ INTERVAL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åıĮ åĩ» æĹ¶ å¤ĦçĲĨ åĽ¾çīĩ ç¼© æĶ¾ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġinner Ġclass ĠAuto Scale Runnable ( private Ġval Ġm Target Scale : ĠFloat , Ġprivate Ġval Ġx : ĠFloat , Ġprivate Ġval Ġy : ĠFloat ) Ġ: ĠRunnable Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm Temp Scale Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ä¼łåħ¥ çĽ®æłĩ ç¼© æĶ¾ åĢ¼ ï¼Į æł¹æį® çĽ®æłĩ åĢ¼ ä¸İ å½ĵåīį åĢ¼ ï¼Į åĪ¤æĸŃ åºĶè¯¥ æĶ¾ å¤§ è¿ĺæĺ¯ ç¼© å°ı ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Temp Scale Ġ= Ġif Ġ( cur Image Scale Ġ< Ġm Target Scale ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComp anion . SCALE _ BIG GER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComp anion . SCALE _ SMALL ER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ è¿Ľè¡Į ç¼© æĶ¾ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Shape Matrix . post Scale ( m Temp Scale , Ġm Temp Scale , Ġx , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck AndUpdate Image Matrix () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Scale Ġ= Ġcur Image Scale ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Temp Scale Ġ> Ġ 1 f Ġ&& Ġcurrent Scale Ġ< Ġm Target Scale Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Temp Scale Ġ< Ġ 1 f Ġ&& Ġm Target Scale Ġ< Ġcurrent Scale ) Ġ{ Ġ// å¦Ĥæŀľ åĢ¼ åľ¨ åĲĪ æ³ķ èĮĥåĽ´ åĨħ ï¼Į ç»§ç»Ń ç¼© æĶ¾ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Delayed ( this , ĠAUTO _ SCALE _ INTERVAL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// è®¾ç½®ä¸º çĽ®æłĩ çļĦ ç¼© æĶ¾ æ¯Ķ ä¾ĭ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Scale Ġ= Ġm Target Scale Ġ/ Ġcurrent Scale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Shape Matrix . post Scale ( delta Scale , Ġdelta Scale , Ġx , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck AndUpdate Image Matrix () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Scaling Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }