/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 0 9 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 2 , 2 0 1 3 , 2 0 1 4 , 2 0 1 5 ĠRen ard ĠWell n itz Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġinfo . h ann es . cv scanner . crop Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Matrix Ċ import Ġandroid . graphics . Rect F Ċ import Ġandroid . graphics . drawable . Bitmap Drawable Ċ import Ġandroid . graphics . drawable . Transition Drawable Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . KeyEvent Ċ import Ġandroidx . appcompat . widget . AppCompat ImageView Ċ Ċ abstract Ġclass ĠImageView Touch Base Ġ: ĠAppCompat ImageView Ġ{ ĊĊĠĠĠ Ġval Ġbitmap Displayed Ġ= ĠRotate Bitmap ( null ) ĊĊĠĠĠ Ġ// ĠThis Ġis Ġthe Ġfinal Ġmatrix Ġwhich Ġis Ġcomputed Ġas Ġthe Ġconcat enation ĊĠĠĠ Ġ// Ġof Ġthe Ġbase Ġmatrix Ġand Ġthe Ġsupp lement ary Ġmatrix . ĊĠĠĠ Ġprivate Ġval Ġm Display Matrix Ġ= ĠMatrix () ĊĊĠĠĠ Ġ// ĠTemporary Ġbuffer Ġused Ġfor Ġgetting Ġthe Ġvalues Ġout Ġof Ġa Ġmatrix . ĊĠĠĠ Ġprivate Ġval Ġm Matrix Values Ġ= ĠFloat Array ( 9 ) ĊĊĠĠĠ Ġ// ĠThis Ġis Ġthe Ġbase Ġtransformation Ġwhich Ġis Ġused Ġto Ġshow Ġthe Ġimage ĊĠĠĠ Ġ// Ġinitially . Ġ ĠThe Ġcurrent Ġcomputation Ġfor Ġthis Ġshows Ġthe Ġimage Ġin ĊĠĠĠ Ġ// Ġit 's Ġentire ty , Ġletter box ing Ġas Ġneeded . Ġ ĠOne Ġcould Ġchoose Ġto ĊĠĠĠ Ġ// Ġshow Ġthe Ġimage Ġas Ġc ropped Ġinstead . ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠThis Ġmatrix Ġis Ġre computed Ġwhen Ġwe Ġgo Ġfrom Ġthe Ġthumbnail Ġimage Ġto ĊĠĠĠ Ġ// Ġthe Ġfull Ġsize Ġimage . ĊĠĠĠ Ġprotected Ġvar Ġm Base Matrix Ġ= ĠMatrix () ĊĊĠĠĠ Ġ// ĠThis Ġis Ġthe Ġsupp lement ary Ġtransformation Ġwhich Ġreflect s Ġwhat ĊĠĠĠ Ġ// Ġthe Ġuser Ġhas Ġdone Ġin Ġterms Ġof Ġzoom ing Ġand Ġp anning . ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠThis Ġmatrix Ġremains Ġthe Ġsame Ġwhen Ġwe Ġgo Ġfrom Ġthe Ġthumbnail Ġimage ĊĠĠĠ Ġ// Ġto Ġthe Ġfull Ġsize Ġimage . ĊĠĠĠ Ġprotected Ġvar Ġm Supp Matrix Ġ= ĠMatrix () ĊĠĠĠ Ġprotected Ġvar Ġm Handler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĠĠĠ Ġvar Ġm This Width Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġvar Ġm This Height Ġ= Ġ- 1 ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġm Max Zoom Ġ= Ġ 0 f ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġm Left Ġ= Ġ 0 ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġm Right Ġ= Ġ 0 ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġm Top Ġ= Ġ 0 ĊĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġm Bottom Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm On Layout Runnable : ĠRunnable ? Ġ= Ġnull ĊĊĠĠĠ Ġconstructor ( context : ĠContext ?) Ġ: Ġsuper ( context !! ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext ?, Ġattrs : ĠAttributeSet ?) Ġ: Ġsuper ( ĊĠĠĠĠĠĠĠ Ġcontext !! , Ġattrs ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Layout ( ĊĠĠĠĠĠĠĠ Ġchanged : ĠBoolean , Ġleft : ĠInt , Ġtop : ĠInt , ĊĠĠĠĠĠĠĠ Ġright : ĠInt , Ġbottom : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Layout ( changed , Ġleft , Ġtop , Ġright , Ġbottom ) ĊĠĠĠĠĠĠĠ Ġm Left Ġ= Ġleft ĊĠĠĠĠĠĠĠ Ġm Right Ġ= Ġright ĊĠĠĠĠĠĠĠ Ġm Top Ġ= Ġtop ĊĠĠĠĠĠĠĠ Ġm Bottom Ġ= Ġbottom ĊĠĠĠĠĠĠĠ Ġm This Width Ġ= Ġright Ġ- Ġleft ĊĠĠĠĠĠĠĠ Ġm This Height Ġ= Ġbottom Ġ- Ġtop ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġm On Layout Runnable ĊĠĠĠĠĠĠĠ Ġif Ġ( r Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm On Layout Runnable Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr . run () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( bitmap Displayed . bitmap Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Pro per Base Matrix ( bitmap Displayed , Ġm Base Matrix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Matrix Ġ= ĠimageView Matrix ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon KeyDown ( keyCode : ĠInt , Ġevent : ĠKeyEvent ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( keyCode Ġ== ĠKeyEvent . KEYCODE _ BACK Ġ&& Ġscale Ġ> Ġ 1 . 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe 're Ġz oo med Ġin , Ġpressing ĠBack Ġjumps Ġout Ġto Ġshow Ġthe Ġentire ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġimage , Ġotherwise ĠBack Ġreturns Ġthe Ġuser Ġto Ġthe Ġgallery . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzoom To ( 1 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on KeyDown ( keyCode , Ġevent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Image Bitmap ( bitmap : ĠBitmap ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Image Bitmap ( bitmap , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Image Bitmap ( bitmap : ĠBitmap ?, Ġrotation : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġbitmap Displayed . bitmap ĊĠĠĠĠĠĠĠ Ġif Ġ( bitmap Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper @ ImageView Touch Base . setImage Bitmap ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Displayed . bitmap Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( drawable Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Transition Ġ= Ġdrawable Ġas ĠTransition Drawable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Transition . reset Transition () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Transition . numberOf Layers Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayer 0 Ġ= Ġold Transition . get Drawable ( 0 ) Ġas ĠBitmap Drawable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayer 0 . bitmap . recycle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old ?. height Ġ!= Ġbitmap . height Ġ|| Ġold . width Ġ!= Ġbitmap . width Ġ|| Ġbitmap Displayed . rotation Ġ!= Ġrotation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Transition . numberOf Layers Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayer 1 Ġ= Ġold Transition . get Drawable ( 1 ) Ġas ĠBitmap Drawable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayer 1 . bitmap . recycle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayers Ġ= ĠarrayOf ( Bitmap Drawable ( resources , Ġbitmap )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransition Drawable Ġ= ĠTransition Drawable ( layers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Image Drawable ( transition Drawable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayers Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Drawable ( resources , Ġold ), ĠBitmap Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources , Ġbitmap ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransition Drawable Ġ= ĠTransition Drawable ( layers ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Image Drawable ( transition Drawable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Drawable . start Transition ( TRANS ITION _ DURATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayers Ġ= ĠarrayOf ( Bitmap Drawable ( resources , Ġbitmap )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransition Drawable Ġ= ĠTransition Drawable ( layers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Image Drawable ( transition Drawable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbitmap Displayed . bitmap Ġ= Ġbitmap ĊĠĠĠĠĠĠĠ Ġbitmap Displayed . rotation Ġ= Ġrotation ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdrawable Ġ= Ġdrawable ĊĠĠĠĠĠĠĠ Ġif Ġ( drawable Ġis ĠBitmap Drawable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbd Ġ= Ġget Drawable () Ġas ĠBitmap Drawable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bd . bitmap Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbd . bitmap . recycle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( drawable Ġis ĠTransition Drawable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġdrawable . numberOf Layers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayer Ġ= Ġdrawable . get Drawable ( i ) Ġas ĠBitmap Drawable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( layer . bitmap Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayer . bitmap . recycle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThis Ġfunction Ġchanges Ġbitmap , Ġreset Ġbase Ġmatrix Ġaccording Ġto Ġthe Ġsize ĊĠĠĠ Ġ// Ġof Ġthe Ġbitmap , Ġand Ġoptionally Ġreset Ġthe Ġsupp lement ary Ġmatrix . ĊĠĠĠ Ġfun Ġset Image Bitmap Reset Base ( bitmap : ĠBitmap ?, Ġreset Supp : ĠBoolean , Ġrotation : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Image Rotate Bitmap Reset Base ( Rotate Bitmap ( bitmap !! , Ġrotation ), Ġreset Supp ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Image Rotate Bitmap Reset Base ( bitmap : ĠRotate Bitmap , Ġreset Supp : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Width Ġ= Ġwidth ĊĠĠĠĠĠĠĠ Ġif Ġ( view Width Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm On Layout Runnable Ġ= ĠRunnable Ġ{ Ġset Image Rotate Bitmap Reset Base ( bitmap , Ġreset Supp ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( bitmap . bitmap Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Pro per Base Matrix ( bitmap , Ġm Base Matrix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Image Bitmap ( bitmap . bitmap , Ġbitmap . rotation ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Base Matrix . reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Image Bitmap ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( reset Supp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Supp Matrix . reset () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġimage Matrix Ġ= ĠimageView Matrix ĊĠĠĠĠĠĠĠ Ġm Max Zoom Ġ= Ġmax Zoom () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCenter Ġas Ġmuch Ġas Ġpossible Ġin Ġone Ġor Ġboth Ġaxis . Ġ ĠCenter ing Ġis ĊĠĠĠ Ġ// Ġdefined Ġas Ġfollows : Ġ Ġif Ġthe Ġimage Ġis Ġscaled Ġdown Ġbelow Ġthe ĊĠĠĠ Ġ// Ġview 's Ġdimensions Ġthen Ġcenter Ġit Ġ( l iter ally ). Ġ ĠIf Ġthe Ġimage ĊĠĠĠ Ġ// Ġis Ġscaled Ġlarger Ġthan Ġthe Ġview Ġand Ġis Ġtranslated Ġout Ġof Ġview ĊĠĠĠ Ġ// Ġthen Ġtranslate Ġit Ġback Ġinto Ġview Ġ( i . e . Ġeliminate Ġblack Ġbars ). ĊĠĠĠ Ġprotected Ġfun Ġcenter ( horizontal : ĠBoolean , Ġvertical : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( bitmap Displayed . bitmap Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġm Ġ= ĠimageView Matrix ĊĠĠĠĠĠĠĠ Ġval Ġrect Ġ= ĠRect F ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 . toFloat (), Ġ 0 . 0 . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Displayed . bitmap ?. width ?. toFloat () Ġ?: Ġ 0 . 0 . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Displayed . bitmap ?. height ?. toFloat () Ġ?: Ġ 0 . 0 . toFloat () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġm . map Rect ( rect ) ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġrect . height () ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġrect . width () ĊĠĠĠĠĠĠĠ Ġvar Ġdelta X Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġvar Ġdelta Y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġif Ġ( vertical ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Height Ġ= Ġget Height () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( height Ġ< Ġview Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelta Y Ġ= Ġ( view Height Ġ- Ġheight ) Ġ/ Ġ 2 Ġ- Ġrect . top ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( rect . top Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelta Y Ġ= Ġ- rect . top ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( rect . bottom Ġ< Ġview Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelta Y Ġ= Ġget Height () Ġ- Ġrect . bottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( horizontal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Width Ġ= Ġget Width () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( width Ġ< Ġview Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelta X Ġ= Ġ( view Width Ġ- Ġwidth ) Ġ/ Ġ 2 Ġ- Ġrect . left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( rect . left Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelta X Ġ= Ġ- rect . left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( rect . right Ġ< Ġview Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelta X Ġ= Ġview Width Ġ- Ġrect . right ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpost Translate ( delta X , Ġdelta Y ) ĊĠĠĠĠĠĠĠ Ġimage Matrix Ġ= ĠimageView Matrix ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġscale Type Ġ= ĠScale Type . MATRIX ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun ĠgetValue ( matrix : ĠMatrix , Ġwhich Value : ĠInt ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġmatrix . getValues ( m Matrix Values ) ĊĠĠĠĠĠĠĠ Ġreturn Ġm Matrix Values [ which Value ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠGet Ġthe Ġscale Ġfactor Ġout Ġof Ġthe Ġmatrix . ĊĠĠĠ Ġprotected Ġfun Ġget Scale ( matrix : ĠMatrix ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠgetValue ( matrix , ĠMatrix . M SCALE _ X ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġval Ġscale : ĠFloat ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġget Scale ( m Supp Matrix ) ĊĊĠĠĠ Ġ// ĠSetup Ġthe Ġbase Ġmatrix Ġso Ġthat Ġthe Ġimage Ġis Ġcentered Ġand Ġscaled Ġproperly . ĊĠĠĠ Ġprivate Ġfun Ġget Pro per Base Matrix ( bitmap : ĠRotate Bitmap , Ġmatrix : ĠMatrix ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Width Ġ= Ġwidth . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġview Height Ġ= Ġheight . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġw Ġ= Ġbitmap . width . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġh Ġ= Ġbitmap . height . toFloat () ĊĠĠĠĠĠĠĠ Ġ// int Ġrotation Ġ= Ġbitmap . get Rotation (); ĊĠĠĠĠĠĠĠ Ġmatrix . reset () ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġlimit Ġup - scaling Ġto Ġ 2 x Ġotherwise Ġthe Ġresult Ġmay Ġlook Ġbad Ġif Ġit 's ĊĠĠĠĠĠĠĠ Ġ// Ġa Ġsmall Ġicon . ĊĠĠĠĠĠĠĠ Ġval Ġwidth Scale Ġ= ĠMath . min ( view Width Ġ/ Ġw , Ġ 2 . 0 f ) ĊĠĠĠĠĠĠĠ Ġval Ġheight Scale Ġ= ĠMath . min ( view Height Ġ/ Ġh , Ġ 2 . 0 f ) ĊĠĠĠĠĠĠĠ Ġval Ġscale Ġ= ĠMath . min ( width Scale , Ġheight Scale ) ĊĠĠĠĠĠĠĠ Ġmatrix . post Concat ( bitmap . rotation Matrix ) ĊĠĠĠĠĠĠĠ Ġmatrix . post Scale ( scale , Ġscale ) ĊĠĠĠĠĠĠĠ Ġmatrix . post Translate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( view Width Ġ- Ġw Ġ* Ġscale ) Ġ/ Ġ 2 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( view Height Ġ- Ġh Ġ* Ġscale ) Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ}// ĠThe Ġfinal Ġmatrix Ġis Ġcomputed Ġas Ġthe Ġconcat enation Ġof Ġthe Ġbase Ġmatrix ĊĊĠĠĠ Ġ// Ġand Ġthe Ġsupp lement ary Ġmatrix . ĊĠĠĠ Ġ// ĠCombine Ġthe Ġbase Ġmatrix Ġand Ġthe Ġsupp Ġmatrix Ġto Ġmake Ġthe Ġfinal Ġmatrix . ĊĠĠĠ Ġprotected Ġval ĠimageView Matrix : ĠMatrix ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġfinal Ġmatrix Ġis Ġcomputed Ġas Ġthe Ġconcat enation Ġof Ġthe Ġbase Ġmatrix ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġthe Ġsupp lement ary Ġmatrix . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Display Matrix . set ( m Base Matrix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Display Matrix . post Concat ( m Supp Matrix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm Display Matrix ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠSets Ġthe Ġmaximum Ġzoom , Ġwhich Ġis Ġa Ġscale Ġrelative Ġto Ġthe Ġbase Ġmatrix . ĠIt ĊĠĠĠ Ġ// Ġis Ġcalculated Ġto Ġshow Ġthe Ġimage Ġat Ġ 4 0 0 % Ġzoom Ġregardless Ġof Ġscreen Ġor ĊĠĠĠ Ġ// Ġimage Ġorientation . ĠIf Ġin Ġthe Ġfuture Ġwe Ġdecode Ġthe Ġfull Ġ 3 Ġme gap ixel Ġimage , ĊĠĠĠ Ġ// Ġrather Ġthan Ġthe Ġcurrent Ġ 1 0 2 4 x 7 6 8 , Ġthis Ġshould Ġbe Ġchanged Ġdown Ġto Ġ 2 0 0 %. ĊĠĠĠ Ġprotected Ġfun Ġmax Zoom (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( bitmap Displayed . bitmap Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 1 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfw Ġ= Ġbitmap Displayed . width . toFloat () Ġ/ Ġm This Width . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġfh Ġ= Ġbitmap Displayed . height . toFloat () Ġ/ Ġm This Height . toFloat () ĊĠĠĠĠĠĠĠ Ġreturn ĠMath . max ( fw , Ġfh ) Ġ* Ġ 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġzoom To ( scale Value : ĠFloat , Ġcenter X : ĠFloat , Ġcenter Y : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġscale Ġ= Ġscale Value ĊĠĠĠĠĠĠĠ Ġif Ġ( scale Ġ> Ġm Max Zoom ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscale Ġ= Ġm Max Zoom ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġold Scale Ġ= Ġscale ĊĠĠĠĠĠĠĠ Ġval Ġdelta Scale Ġ= Ġscale Ġ/ Ġold Scale ĊĠĠĠĠĠĠĠ Ġm Supp Matrix . post Scale ( delta Scale , Ġdelta Scale , Ġcenter X , Ġcenter Y ) ĊĠĠĠĠĠĠĠ Ġimage Matrix Ġ= ĠimageView Matrix ĊĠĠĠĠĠĠĠ Ġcenter ( true , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġzoom To ( ĊĠĠĠĠĠĠĠ Ġscale : ĠFloat , Ġcenter X : ĠFloat , ĊĠĠĠĠĠĠĠ Ġcenter Y : ĠFloat , Ġduration Ms : ĠFloat ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġincrement Per Ms Ġ= Ġ( scale Ġ- Ġscale ) Ġ/ Ġduration Ms ĊĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġm Handler . post ( object Ġ: ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Ms Ġ= ĠMath . min ( duration Ms , Ġ( now Ġ- ĠstartTime ). toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġscale Ġ+ Ġincrement Per Ms Ġ* Ġcurrent Ms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzoom To ( target , Ġcenter X , Ġcenter Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ms Ġ< Ġduration Ms ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Handler . post ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Zoom Finished () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġon Zoom Finished () ĊĠĠĠ Ġprivate Ġfun Ġzoom To ( scale : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcx Ġ= Ġwidth Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠ Ġval Ġcy Ġ= Ġheight Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠ Ġzoom To ( scale , Ġcx , Ġcy ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġzoom To ( scale : ĠFloat , Ġduration Ms : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcx Ġ= Ġwidth Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠ Ġval Ġcy Ġ= Ġheight Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠ Ġzoom To ( scale , Ġcx , Ġcy , Ġduration Ms ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġzoom In () Ġ{ ĊĠĠĠĠĠĠĠ Ġzoom In ( SCALE _ RATE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġzoom Out () Ġ{ ĊĠĠĠĠĠĠĠ Ġzoom Out ( SCALE _ RATE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġzoom In ( rate : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( scale Ġ>= Ġm Max Zoom ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ Ġ// ĠDon 't Ġlet Ġthe Ġuser Ġzoom Ġinto Ġthe Ġmolec ular Ġlevel . ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( bitmap Displayed . bitmap Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcx Ġ= Ġwidth Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠ Ġval Ġcy Ġ= Ġheight Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠ Ġm Supp Matrix . post Scale ( rate , Ġrate , Ġcx , Ġcy ) ĊĠĠĠĠĠĠĠ Ġimage Matrix Ġ= ĠimageView Matrix ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġzoom Out ( rate : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( bitmap Displayed . bitmap Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcx Ġ= Ġwidth Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠ Ġval Ġcy Ġ= Ġheight Ġ/ Ġ 2 f ĊĊĠĠĠĠĠĠĠ Ġ// ĠZoom Ġout Ġto Ġat Ġmost Ġ 1 x . ĊĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= ĠMatrix ( m Supp Matrix ) ĊĠĠĠĠĠĠĠ Ġtmp . post Scale ( 1 f Ġ/ Ġrate , Ġ 1 f Ġ/ Ġrate , Ġcx , Ġcy ) ĊĠĠĠĠĠĠĠ Ġif Ġ( get Scale ( tmp ) Ġ< Ġ 1 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Supp Matrix . set Scale ( 1 f , Ġ 1 f , Ġcx , Ġcy ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Supp Matrix . post Scale ( 1 f Ġ/ Ġrate , Ġ 1 f Ġ/ Ġrate , Ġcx , Ġcy ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġimage Matrix Ġ= ĠimageView Matrix ĊĠĠĠĠĠĠĠ Ġcenter ( true , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġpost Translate ( dx : ĠFloat , Ġdy : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Supp Matrix . post Translate ( dx , Ġdy ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġpan By ( dx : ĠFloat , Ġdy : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpost Translate ( dx , Ġdy ) ĊĠĠĠĠĠĠĠ Ġimage Matrix Ġ= ĠimageView Matrix ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTRANS ITION _ DURATION Ġ= Ġ 5 0 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSC ALE _ RATE Ġ= Ġ 1 . 2 5 f ĊĠĠĠ Ġ} Ċ }