package Ġcom . github . to xa 2 0 3 3 Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . graphics . Matrix Ċ import Ġandroid . graphics . Rect F Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . ImageView Ċ import Ġcom . github . to xa 2 0 3 3 . Constants . MAX _ RATE _ DIS MIS S Ċ import Ġcom . github . to xa 2 0 3 3 . Constants . MIN _ RATE _ DIS MIS S Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . sqrt Ċ Ċ internal Ġclass ĠScale Image Helper ( private Ġval ĠimageView : ĠScale ImageView ) Ġ: ĠIS cale Image Ġ{ ĊĊĠĠĠ Ġvar Ġm Scale Type : ĠImageView . Scale Type Ġ= ĠImageView . Scale Type . FIT _ CENTER ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmake Image () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdefault Rect : ĠRect F ĊĊĠĠĠ Ġprivate Ġvar Ġdismiss Rate Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Dismiss Rate Change ( dismiss Rate , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent View Y Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġy To Dismiss Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġcurrent Fl ing Runnable : ĠF ling Scroll Runnable ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġon Dismiss Rate Change : Ġ( dismiss Rate : ĠFloat , Ġis Can Now Dismiss : ĠBoolean ) Ġ-> ĠUnit Ġ= Ġ{ Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠ Ġvar Ġon Zoom Change : Ġ( current Scale : ĠFloat , Ġmin Scale : ĠFloat , max Scale : ĠFloat ) Ġ-> ĠUnit Ġ= Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠ Ġvar Ġis Dismiss Enabled Ġ= Ġtrue ĊĠĠĠ Ġvar Ġis Zoom Enabled Ġ= Ġtrue ĊĊĠĠĠ Ġprivate Ġval Ġm Matrix Values Ġ= ĠFloat Array ( 9 ) ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠimageView Rect F : ĠRect F ĊĊĠĠĠ Ġprivate Ġvar Ġsupp Matrix Ġ= ĠMatrix () ĊĠĠĠ Ġprivate Ġvar Ġmiddleware Matrix Ġ= ĠMatrix () ĊĠĠĠ Ġprivate Ġvar Ġgest ures Ġ= ĠCustom Gest ures ( imageView . context , Ġthis ) ĊĊĠĠĠ Ġprivate Ġvar Ġmax Scale Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġmin Scale Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġmid Scale Ġ= Ġ 0 f ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Zoom : Float Ġ= Ġ 0 f ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( value != field ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Zoom Change ( current Zoom , min Scale , max Scale ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetMax Scale () Ġ= Ġmax Scale ĊĊĠĠĠ Ġoverride Ġfun Ġget Min Scale () Ġ= Ġmin Scale ĊĊĠĠĠ Ġoverride Ġfun Ġget Mid Scale () Ġ= Ġmid Scale ĊĊĠĠĠ Ġprivate Ġval Ġon Layout ChangeListener Ġ= ĠView . On Layout ChangeListener Ġ{ Ġview , Ġ_, Ġ_, Ġ_, Ġ_, Ġ_, Ġ_, Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ ĠimageView Rect F Ġ= ĠRect F ( view . left . toFloat (), Ġview . top . toFloat (), Ġview . right . toFloat (), Ġview . bottom . toFloat ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠĠĠ Ġfun Ġmake Image () Ġ{ ĊĠĠĠĠĠĠĠ ĠimageView . drawable ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠimageView . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsupp Matrix Ġ= ĠgetDefault Matrix () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Rect Ġ= Ġget Matrix Bounds ( supp Matrix ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmiddleware Matrix Ġ= ĠgetDefault Matrix () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠimageView . image Matrix Ġ= Ġsupp Matrix ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent View Y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy To Dismiss Ġ= ĠimageView . meas ured Height Ġ/ Ġ 4 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Scale Ġ= Ġget Scale () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Zoom Ġ= Ġmin Scale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmid Scale Ġ= Ġmin Scale Ġ* Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Scale Ġ= Ġmid Scale Ġ* Ġ 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠimageView . setOn Touch Listener ( gest ures ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠimageView . remove On Layout ChangeListener ( on Layout ChangeListener ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠimageView . add On Layout ChangeListener ( on Layout ChangeListener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetDefault Matrix (): ĠMatrix Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġd Width Ġ= ĠimageView . drawable . intrinsic Width ĊĠĠĠĠĠĠĠ Ġval Ġd Height Ġ= ĠimageView . drawable . intrinsic Height ĊĠĠĠĠĠĠĠ Ġval Ġv Width Ġ= ĠimageView . meas ured Width ĊĠĠĠĠĠĠĠ Ġval Ġv Height Ġ= ĠimageView . meas ured Height ĊĠĠĠĠĠĠĠ Ġval Ġwidth Scale Ġ= Ġv Width . toFloat () Ġ/ Ġd Width . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġheight Scale Ġ= Ġv Height . toFloat () Ġ/ Ġd Height . toFloat () ĊĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( m Scale Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImageView . Scale Type . CENTER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . post Translate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( v Width Ġ- Ġd Width ) Ġ/ Ġ 2 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( v Height Ġ- Ġd Height ) Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImageView . Scale Type . CENTER _ C ROP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġmax ( width Scale , Ġheight Scale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . post Scale ( scale , Ġscale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . post Translate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( v Width Ġ- Ġd Width Ġ* Ġscale ) Ġ/ Ġ 2 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( v Height Ġ- Ġd Height Ġ* Ġscale ) Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImageView . Scale Type . CENTER _ INS IDE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Ġ= ĠMath . min ( 1 f , ĠMath . min ( width Scale , Ġheight Scale )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . post Scale ( scale , Ġscale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . post Translate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( v Width Ġ- Ġd Width Ġ* Ġscale ) Ġ/ Ġ 2 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( v Height Ġ- Ġd Height Ġ* Ġscale ) Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Temp Src Ġ= ĠRect F ( 0 f , Ġ 0 f , Ġd Width . toFloat (), Ġd Height . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Temp Dst Ġ= ĠRect F ( 0 f , Ġ 0 f , Ġv Width . toFloat (), Ġv Height . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( m Scale Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImageView . Scale Type . FIT _ CENTER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . set Rect To Rect ( m Temp Src , Ġm Temp Dst , ĠMatrix . Scale To Fit . CENTER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImageView . Scale Type . FIT _ START Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . set Rect To Rect ( m Temp Src , Ġm Temp Dst , ĠMatrix . Scale To Fit . START ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImageView . Scale Type . FIT _ END Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . set Rect To Rect ( m Temp Src , Ġm Temp Dst , ĠMatrix . Scale To Fit . END ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠImageView . Scale Type . FIT _ XY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . set Rect To Rect ( m Temp Src , Ġm Temp Dst , ĠMatrix . Scale To Fit . FILL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmatrix ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdrag To Dismiss ( dy : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent View Y Ġ+= Ġdy ĊĠĠĠĠĠĠĠ Ġdismiss Rate Ġ= Ġabs ( current View Y ) Ġ/ Ġy To Dismiss ĊĊĠĠĠĠĠĠĠ Ġif Ġ( dismiss Rate Ġ> ĠMAX _ RATE _ DIS MIS S ) Ġdismiss Rate Ġ= ĠMAX _ RATE _ DIS MIS S ĊĠĠĠĠĠĠĠ Ġif Ġ( dismiss Rate Ġ< ĠMIN _ RATE _ DIS MIS S ) Ġdismiss Rate Ġ= ĠMIN _ RATE _ DIS MIS S ĊĊĠĠĠĠĠĠĠ Ġsupp Matrix . post Translate ( 0 f , Ġdy ) ĊĠĠĠĠĠĠĠ ĠimageView . image Matrix Ġ= Ġsupp Matrix ĊĊĠĠĠĠĠĠĠ Ġmiddleware Matrix . reset () ĊĠĠĠĠĠĠĠ Ġmiddleware Matrix . post Concat ( supp Matrix ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfl ing ( last X : ĠInt , Ġlast Y : ĠInt , Ġv X : ĠInt , Ġv Y : ĠInt , Ġis Drag To Dismiss : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Drag To Dismiss Ġ&& Ġ! is Dismiss Enabled ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġdisplay Rect F Ġ= ĠRect F ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- imageView Rect F . right , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- imageView Rect F . bottom , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠimageView Rect F . right , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠimageView Rect F . bottom ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġvar Ġis Can Now Dismiss Was Exec Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġcurrent Fl ing Runnable Ġ= ĠF ling Scroll Runnable ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠimageView , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Drag To Dismiss ) Ġget Matrix Bounds ( supp Matrix ) Ġelse Ġdisplay Rect F , Ġis Drag To Dismiss , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Drag To Dismiss ) Ġ:: check Bounds Image And Apply Move Ġelse Ġ:: check Bounds Image And Apply Move For Swipe To Dismiss , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( is Drag To Dismiss Ġ&& Ġdismiss Rate Ġ== ĠMAX _ RATE _ DIS MIS S Ġ&& Ġ! is Can Now Dismiss Was Exec ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Dismiss Rate Change ( dismiss Rate , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Can Now Dismiss Was Exec Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Drag To Dismiss ) Ġto Default Position () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Can Now Dismiss Was Exec Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent Fl ing Runnable ?. fl ing ( last X , Ġlast Y , Ġv X , Ġv Y ) ĊĠĠĠĠĠĠĠ ĠimageView . post ( current Fl ing Runnable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġend Of Gesture Zoom () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Zoom Enabled ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġcurr Scale Ġ= Ġget Scale () ĊĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġif Ġ( curr Scale Ġ< Ġmin Scale ) Ġmin Scale Ġelse Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġzoom Animation Runnable Ġ= ĠZoom Animation Runnable ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Scale , Ġscale , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Rect . center X (), Ġdefault Rect . center Y (), Ġthis , ĠimageView ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠimageView . post ( zoom Animation Runnable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġto Default Position ( exec Dismiss Change : Boolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( dismiss Rate Ġ!= ĠMAX _ RATE _ DIS MIS S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscroll To Default Ġ= ĠScroll To Default Animation Runnable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠimageView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Matrix Bounds ( supp Matrix ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ:: drag To Dismiss ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscroll To Default . start S roll ( default Rect . center Y ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠimageView . post ( scrollTo Default ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( exec Dismiss Change ) Ġon Dismiss Rate Change ( dismiss Rate , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcancel Fl ing () Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Fl ing Runnable ?. cancel Fl ing () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġscale Image ( scale Factor : ĠFloat , Ġx : ĠFloat , Ġy : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Zoom Enabled ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġsupp Matrix . post Scale ( scale Factor , Ġscale Factor , Ġx , Ġy ) ĊĠĠĠĠĠĠĠ Ġmiddleware Matrix . reset () ĊĠĠĠĠĠĠĠ Ġmiddleware Matrix . post Concat ( supp Matrix ) ĊĠĠĠĠĠĠĠ Ġcheck Bounds Image And Apply Move ( 0 f , Ġ 0 f , Ġtrue ) ĊĠĠĠĠĠĠĠ ĠimageView . image Matrix Ġ= Ġsupp Matrix ĊĠĠĠĠĠĠĠ Ġcurrent Zoom Ġ= Ġget Scale () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġscale By Double Tap ( scale : ĠFloat , Ġx : ĠFloat , Ġy : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Zoom Enabled ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġzoom Animation Runnable Ġ= ĠZoom Animation Runnable ( get Scale (), Ġscale , Ġx , Ġy , Ġthis , ĠimageView ) ĊĠĠĠĠĠĠĠ ĠimageView . post ( zoom Animation Runnable ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġget Scale From Matrix ( matrix : ĠMatrix ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsqrt ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( Math . pow ( getValue ( supp Matrix , ĠMatrix . M SCALE _ X ), Ġ 2 . 0 ). toFloat () Ġ+ ĠMath . pow ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetValue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMatrix . MS KE W _ Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġ 2 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). toFloat ()). toDouble () ĊĠĠĠĠĠĠĠ Ġ). toFloat () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Scale (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Scale From Matrix ( supp Matrix ). round To Digits ( 5 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Can Scroll (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrect Ġ= Ġget Matrix Bounds ( supp Matrix ) ĊĠĠĠĠĠĠĠ Ġreturn ĠimageView . meas ured Width Ġ< Ġrect . width () Ġ|| ĠimageView . meas ured Height Ġ< Ġrect . height () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Can Drag To Dismiss (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrect Ġ= Ġget Matrix Bounds ( supp Matrix ) ĊĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġget Scale () ĊĠĠĠĠĠĠĠ Ġreturn Ġscale Ġ<= Ġmin Scale Ġ&& Ġ( rect . bottom Ġ<= ĠimageView Rect F . bottom Ġ|| Ġrect . top Ġ>= ĠimageView Rect F . top ) Ġ&& Ġis Dismiss Enabled ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetValue ( matrix : ĠMatrix , Ġwhich Value : ĠInt ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġmatrix . getValues ( m Matrix Values ) ĊĠĠĠĠĠĠĠ Ġreturn Ġm Matrix Values [ which Value ]. toDouble () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġscroll Image ( dx : ĠFloat , Ġdy : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Bounds Image And Apply Move ( dx , Ġdy ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Bounds Image And Apply Move For Swipe To Dismiss ( ĊĠĠĠĠĠĠĠ Ġdx : ĠFloat Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠ Ġdy : ĠFloat Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠ Ġis For Scale : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġis For Drag To Dismiss : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdrag To Dismiss ( dy ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Bounds Image And Apply Move ( ĊĠĠĠĠĠĠĠ Ġdx : ĠFloat Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠ Ġdy : ĠFloat Ġ= Ġ 0 f , ĊĠĠĠĠĠĠĠ Ġis For Scale : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġis For Drag To Dismiss : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġmiddleware Matrix . post Translate ( dx , Ġdy ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrect Ġ= Ġget Matrix Bounds ( middleware Matrix ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġtemp Dx Ġ= Ġdx ĊĠĠĠĠĠĠĠ Ġvar Ġtemp Dy Ġ= Ġdy ĊĊĠĠĠĠĠĠĠ Ġval Ġheight Drawable Ġ= Ġrect . bottom Ġ- Ġrect . top ĊĠĠĠĠĠĠĠ Ġval Ġwidth Drawable Ġ= Ġrect . right Ġ- Ġrect . left ĊĊĠĠĠĠĠĠĠ Ġval Ġcenter Y Default Ġ= Ġdefault Rect . center Y () ĊĠĠĠĠĠĠĠ Ġval Ġcenter Y Current Ġ= Ġrect . center Y () ĊĊĠĠĠĠĠĠĠ Ġval Ġcenter X Default Ġ= Ġdefault Rect . center X () ĊĠĠĠĠĠĠĠ Ġval Ġcenter X Current Ġ= Ġrect . center X () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( height Drawable Ġ< ĠimageView . meas ured Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is For Scale ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Dy Ġ= Ġcenter Y Default Ġ- Ġcenter Y Current ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Dy Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// check Ġtop Ġand Ġbottom Ġborders Ġfor Ġout Ġof Ġbounds Ġin Ġdy Ġscroll ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Can Drag To Dismiss () Ġ|| Ġ! is For Drag To Dismiss ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rect . top Ġ> ĠimageView Rect F . top ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Dy Ġ-= ĠimageView Rect F . top Ġ+ Ġrect . top ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( rect . bottom Ġ< ĠimageView Rect F . bottom ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Dy Ġ+= ĠimageView Rect F . bottom Ġ- Ġrect . bottom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( width Drawable Ġ< ĠimageView . meas ured Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is For Scale ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Dx Ġ= Ġcenter X Default Ġ- Ġcenter X Current ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Dx Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// check Ġleft Ġand Ġright Ġborders Ġfor Ġout Ġof Ġbounds Ġin Ġdx Ġscroll ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rect . left Ġ> ĠimageView Rect F . left ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Dx Ġ-= ĠimageView Rect F . left Ġ+ Ġrect . left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( rect . right Ġ< ĠimageView Rect F . right ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Dx Ġ+= ĠimageView Rect F . right Ġ- Ġrect . right ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( temp Dx Ġ!= Ġ 0 f Ġ|| Ġtemp Dy Ġ!= Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsupp Matrix . post Translate ( temp Dx , Ġtemp Dy ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠimageView . image Matrix Ġ= Ġsupp Matrix ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmiddleware Matrix . reset () ĊĠĠĠĠĠĠĠ Ġmiddleware Matrix . post Concat ( supp Matrix ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Matrix Bounds ( matrix : ĠMatrix ): ĠRect F Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbounds Ġ= ĠRect F () ĊĠĠĠĠĠĠĠ Ġval Ġdrawable Ġ= ĠimageView . drawable ĊĠĠĠĠĠĠĠ Ġif Ġ( drawable Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . map Rect ( bounds , ĠRect F ( drawable . bounds )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbounds ĊĠĠĠ Ġ} Ċ Ċ }