package Ġcom . l uk el or us so . zoom able image box . ui . view Ċ Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroidx . compose . foundation . Image Ċ import Ġandroidx . compose . foundation . background Ċ import Ġandroidx . compose . foundation . gest ures . detect Transform Gest ures Ċ import Ġandroidx . compose . foundation . layout . Box Ċ import Ġandroidx . compose . foundation . layout . fill MaxSize Ċ import Ġandroidx . compose . foundation . layout . offset Ċ import Ġandroidx . compose . foundation . layout . padding Ċ import Ġandroidx . compose . foundation . shape . Circle Shape Ċ import Ġandroidx . compose . material . Icon Ċ import Ġandroidx . compose . material . IconButton Ċ import Ġandroidx . compose . material . Material Theme Ċ import Ġandroidx . compose . material . icons . Icons Ċ import Ġandroidx . compose . material . icons . filled . Refresh Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . ui . Alignment Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . graphics . as Image Bitmap Ċ import Ġandroidx . compose . ui . graphics . graphics Layer Ċ import Ġandroidx . compose . ui . graphics . p ainter . Painter Ċ import Ġandroidx . compose . ui . input . pointer . pointer Input Ċ import Ġandroidx . compose . ui . layout . Content Scale Ċ import Ġandroidx . compose . ui . res . string Resource Ċ import Ġandroidx . compose . ui . unit . Int Offset Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġkotlin . math . PI Ċ import Ġkotlin . math . cos Ċ import Ġkotlin . math . round ToInt Ċ import Ġkotlin . math . sin Ċ Ċ private Ġconst Ġval ĠINITIAL _ ANGLE Ġ= Ġ 0 f Ċ private Ġconst Ġval ĠINITIAL _ ZO OM Ġ= Ġ 1 f Ċ private Ġconst Ġval ĠINITIAL _ OFFSET Ġ= Ġ 0 f Ċ private Ġconst Ġval ĠICON _ P ADDING Ġ= Ġ 8 Ċ Ċ /** Ċ Ġ* Ġ@ author ĠCopyright Ġ( C ) Ġ 2 0 2 2 ĠL uke ĠL or us so Ġ- Ġhttps :// l uk el or us so . com Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense ĠVersion Ġ 2 . 0 Ċ Ġ* Ċ Ġ* ĠThis Ġ[ Composable ] Ġ[ Box ] Ġallows Ġyou Ġto Ġrender Ġan Ġ[ Image ] Ġwhich Ġcan Ġbe Ġz oo med Ġin / out Ġand Ġrotated . Ċ Ġ* Ġ@ param Ġmodifier Ġapplied Ġto Ġthe Ġ[ Box ] Ċ Ġ* Ġ@ param Ġcontent Alignment Ġapplied Ġto Ġthe Ġ[ Box ]: Ġdetermines Ġthe Ġreset Ġ[ IconButton ] Ġposition Ċ Ġ* Ġ@ param Ġcontent Description Ġof Ġyour Ġ[ Image ] Ċ Ġ* Ġ@ param Ġbitmap Ġto Ġdraw Ġin Ġyour Ġ[ Image ] Ċ Ġ* Ġ@ param Ġpainter Ġdrawable Ġresource Ġof Ġyour Ġ[ Image ] Ġ( can Ġbe Ġused Ġinstead Ġof Ġbitmap ) Ċ Ġ* Ġ@ param Ġimage Content Scale Ġof Ġyour Ġ[ Image ]: Ġcan Ġbe Ġchanged Ċ Ġ* Ġ@ param Ġshould Rotate Ġyour Ġ[ Image ]: Ġcan Ġbe Ġtoggle d Ġon / off Ċ Ġ* Ġ@ param Ġshow Reset IconButton Ġcan Ġbe Ġtoggle d Ġon / off Ċ Ġ* Ġ@ param Ġreset IconButton Modifier Ġis Ġthe Ġcustom izable Ġmodifier Ġof Ġthe Ġ[ IconButton ], Ġwhich Ġcontains Ċ Ġ* Ġ Ġthe Ġreset IconButton Content Ġ( useful Ġif Ġshow Reset Button Ġis Ġtrue ) Ċ Ġ* Ġ@ param Ġreset IconButton Content Ġis Ġthe Ġcustom izable Ġcontent Ġof Ġthe Ġ[ IconButton ] Ġ( useful Ġif Ċ Ġ* Ġ Ġshow Reset Button Ġis Ġtrue ) Ċ Ġ*/ Ċ @ Composable Ċ fun ĠZoom able Image Box ( ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier , ĊĠĠĠ Ġcontent Alignment : ĠAlignment Ġ= ĠAlignment . Bottom End , ĊĠĠĠ Ġcontent Description : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġbitmap : ĠBitmap ? Ġ= Ġnull , ĊĠĠĠ Ġpainter : ĠP ainter ? Ġ= Ġnull , ĊĠĠĠ Ġimage Content Scale : ĠContent Scale Ġ= ĠContent Scale . Inside , ĊĠĠĠ Ġshould Rotate : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġshow Reset IconButton : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġreset IconButton Modifier : ĠModifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠ Ġ. padding ( ICON _ P ADDING . dp ) ĊĠĠĠĠĠĠĠ Ġ. background ( Material Theme . colors . surface , Ġshape Ġ= ĠCircle Shape ), ĊĠĠĠ Ġreset IconButton Content : Ġ@ Composable Ġ() Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠ ĠIcon ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Vector Ġ= ĠIcons . Default . Refresh , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Description Ġ= Ġstring Resource ( id Ġ= Ġandroid . R . string . cancel ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt int Ġ= ĠMaterial Theme . colors . primary ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ ) Ġ{ ĊĠĠĠ Ġ// region Ġproperties ĊĠĠĠ Ġval Ġangle Ġ= Ġremember Ġ{ Ġmutable State Of ( INITIAL _ ANGLE ) Ġ} ĊĠĠĠ Ġval Ġzoom Ġ= Ġremember Ġ{ Ġmutable State Of ( INITIAL _ ZO OM ) Ġ} ĊĠĠĠ Ġval Ġoffset X Ġ= Ġremember Ġ{ Ġmutable State Of ( INITIAL _ OFFSET ) Ġ} ĊĠĠĠ Ġval Ġoffset Y Ġ= Ġremember Ġ{ Ġmutable State Of ( INITIAL _ OFFSET ) Ġ} ĊĠĠĠ Ġval Ġis Gesture Detected Ġ= Ġremember Ġ{ Ġmutable State Of ( false ) Ġ} ĊĠĠĠ Ġ// endregion ĊĊĠĠĠ Ġreturn ĠBox ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier , ĊĠĠĠĠĠĠĠ Ġcontent Alignment Ġ= Ġcontent Alignment ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġimage Modifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill MaxSize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. offset Ġ{ ĠInt Offset ( offset X . value . round ToInt (), Ġoffset Y . value . round ToInt ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. graphics Layer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale X Ġ= Ġzoom . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Y Ġ= Ġzoom . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrotation Z Ġ= Ġangle . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. pointer Input ( Unit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetect Transform Gest ures ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Gesture Ġ= Ġ{ Ġ_, Ġpan , Ġgesture Zoom , Ġgesture Rotate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Rotate ) Ġangle . value Ġ+= Ġgesture Rotate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzoom . value Ġ*= Ġgesture Zoom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġpan . x Ġ* Ġzoom . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġpan . y Ġ* Ġzoom . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġangle Rad Ġ= Ġangle . value Ġ* ĠPI Ġ/ Ġ 1 8 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset X . value Ġ+= Ġ( x Ġ* Ġcos ( angle Rad ) Ġ- Ġy Ġ* Ġsin ( angle Rad )). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Y . value Ġ+= Ġ( x Ġ* Ġsin ( angle Rad ) Ġ+ Ġy Ġ* Ġcos ( angle Rad )). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Gesture Detected . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// region ĠImage ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Ġ!= Ġnull Ġ-> ĠImage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġimage Modifier , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Description Ġ= Ġcontent Description , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Ġ= Ġbitmap . as Image Bitmap (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Scale Ġ= Ġimage Content Scale ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpainter Ġ!= Ġnull Ġ-> ĠImage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġimage Modifier , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Description Ġ= Ġcontent Description , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpainter Ġ= Ġpainter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Scale Ġ= Ġimage Content Scale ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// endregion ĊĊĠĠĠĠĠĠĠ Ġ// region Ġreset Ġbutton ĊĠĠĠĠĠĠĠ Ġif Ġ( show Reset IconButton Ġ&& Ġis Gesture Detected . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIcon Button ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġreset IconButton Modifier , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġangle . value Ġ= ĠINITIAL _ ANGLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzoom . value Ġ= ĠINITIAL _ ZO OM ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset X . value Ġ= ĠINITIAL _ OFFSET ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Y . value Ġ= ĠINITIAL _ OFFSET ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Gesture Detected . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġreset IconButton Content ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// endregion ĊĠĠĠ Ġ} Ċ } Ċ